偷偷摘套内射激情视频,久久精品99国产国产精,中文字幕无线乱码人妻,中文在线中文a,性爽19p

C++開發(fā)者快速學(xué)習(xí)Objective-C語言核心語法

移動(dòng)開發(fā) iOS
本文將Objective-C討論了語言的核心語法。這部分開始詳述一些具體的語法。正如你期待的一樣,涉及到了定義和類。

本文將Objective-C討論了語言的核心語法。這部分開始詳述一些具體的語法。正如你期待的一樣,涉及到了定義和類。

類并不是特殊的

在Smalltalk中,類是具有一些特性的對(duì)象。在Objective-C中也一樣。一個(gè)類是一個(gè)對(duì)象,對(duì)象回應(yīng)消息。Objective-C和C++都分離了對(duì)象分配和初始化。

在C++中,對(duì)象分配通過新的操作。在Objective-C中,這樣的操作是通過給類發(fā)送分配消息—調(diào)用malloc()或者一個(gè)等價(jià)。

C++中的初始化是通過調(diào)用一個(gè)與類同名的函數(shù)。Objective-C并沒有區(qū)別初始化方法和其他方法,但出于慣例缺省的初始化方法就是初始化。

當(dāng)你聲明一個(gè)方法讓實(shí)例去回應(yīng),聲明通常已“-”開頭,并且“+”用作類的方法。在文檔中對(duì)這些消息使用一些前綴是很普遍的,所以你也可以說+alloc和-init來暗示alloc是傳給一個(gè)類,init傳給實(shí)例。

類在Objective-C中,正如在其他一些面向?qū)ο笳Z言,都是對(duì)象工廠。大多數(shù)類不用自行實(shí)現(xiàn)+alloc,而是從他們的父類中繼承。在 NSObject中,父類在大多數(shù)Objective-C程序中,+alloc方法調(diào)用+allocWithZone:.使NSZone作為一個(gè)參數(shù),一 個(gè)C結(jié)構(gòu)包含對(duì)象分配的一些策略?;仡?9世紀(jì)80年代,當(dāng)Objective-C用在NeXTstep來實(shí)現(xiàn)設(shè)備驅(qū)動(dòng)和只有8MB內(nèi)存25MHZ的 CPU機(jī)器的GUI上面時(shí),NSZone對(duì)優(yōu)化非常重要。同時(shí),這或多或少的被Objective-C程序員所忽視。(很有可能成為象NUMA構(gòu)架一樣流 行,更普遍。)

眾多優(yōu)秀的特性之一就是對(duì)象創(chuàng)建語義是由庫定義的并且語言不是類簇的思想。當(dāng)你傳一個(gè)-init消息給對(duì)象時(shí),它返回一個(gè)初始化對(duì)象。這可能是你發(fā)送消息的那個(gè)對(duì)象,但不一定肯定就是。這和其他初始化程序一致的。很有可能一些公共類的特殊子類在不同數(shù)據(jù)上更有效。

實(shí)現(xiàn)這個(gè)特性的通用方法叫做isa-swizzling。正如我前述,Objective-C對(duì)象是C結(jié)構(gòu),這些結(jié)構(gòu)***個(gè)元素是指向類的指針。這 個(gè)元素是可存取的,正如其他實(shí)例變量一樣;你可以在運(yùn)行時(shí)通過分配新值來改變對(duì)象的類。當(dāng)然,如果你對(duì)對(duì)象的類設(shè)置在內(nèi)存中有著不同的布局,這些設(shè)置可能 嚴(yán)重錯(cuò)誤。

然而,你可以通過一個(gè)父類來定義布局和通過子集的集合定義行為,舉例來說,這個(gè)技術(shù)用在標(biāo)準(zhǔn)化字符串類(NSString),它對(duì)不同的文本字符集、靜態(tài)事物和其它一些有著各種各樣的實(shí)例。

因?yàn)轭愂菍?duì)象,你可以象操作對(duì)象一樣操作他們。舉例來說,你可以把他們放在集合。當(dāng)我有一些輸入事件需要通過不同的類的實(shí)例來處理時(shí)我就使用這種格 式。你需要?jiǎng)?chuàng)建一個(gè)目錄映射事件命名到類,然后為每一個(gè)輸入事件實(shí)例化一個(gè)對(duì)象。如果你在一個(gè)庫中這么做,它允許代碼的使用者輕松的注冊(cè)屬于他們自己的句 柄。

類型和指針

Objective-C沒有公開允許在堆棧上定義對(duì)象。但并不是真的—很有可能在堆棧上定義對(duì)象,但有些困難,因?yàn)樗茐牧藢?duì)內(nèi)存管理的一種假設(shè)。 結(jié)果,每一個(gè)Objective-C對(duì)象都是一個(gè)指針。一些類型由Objective-C定義;這些類型在頭部定義作為C類型。

在Objective-C中最普遍的3種類型就是id,Class和SEL。id就是指向Objective-C對(duì)象的指針,它等價(jià)于C語言中的void*,你可以映射任何對(duì)象指針類型指向它并且映射他指向其它的對(duì)象指針類型。

你可以傳任何消息給id,但如果不支持的話會(huì)返回一個(gè)運(yùn)行時(shí)異常。

類是指向Objective-C類的指針。類是對(duì)象,所以也可以接收消息。類名是一種類型,不是可變的。標(biāo)識(shí)符NSObject是一個(gè)NSObject實(shí)例的類型,但也可作為消息接受者。你可以獲得一個(gè)類,如下:

  1. [NSObject class]; 

發(fā)送一個(gè)+class消息給NSObject類,然后返回一個(gè)指向代表類的類結(jié)構(gòu)指針。

這對(duì)我們回顧是非常有用的[FS:PAGE],正如我們?cè)谶@個(gè)系列第二部分看到的一樣。

第三種類型SEL,代表一個(gè)選擇器—一個(gè)代表方法名的抽象。你可以在編譯時(shí)通過@selector()直接創(chuàng)建,或在運(yùn)行時(shí)通過C字符串調(diào)用運(yùn)行時(shí) 庫函數(shù),或用OpenStep NSSelectorFromString()函數(shù),這個(gè)函數(shù)給Objective-C字符串一個(gè)選擇器。這個(gè)技術(shù)允許你通過名字調(diào)用方法。你可以在C中 通過使用類似dlsym(),但在C++中非常不同。在Objective-C中,你可以做的如下:

  1. [object perfomSelector:@selector(doSomething)]; 

這等價(jià)于如下:

  1. [object doSomething]; 

顯然,第二種格式速度稍微快些,因?yàn)?**種傳送兩個(gè)消息。后面,我們會(huì)看到通過選擇器處理的一些細(xì)節(jié)。

C++沒有與id相同的類型。因?yàn)閷?duì)象總是可以類型化的。在Objective-C,你可以選擇類型系統(tǒng)。下面的兩種都是有效的:

  1. id object = @”a string”;  
  2.   
  3. NSString *string = @”a string”; 

常量字符串實(shí)際上是NSConstantString類的一個(gè)實(shí)例,NSConstantString類是NSString的子類。將它引用到 NSString* 使編譯時(shí)對(duì)消息進(jìn)行類型檢查和存儲(chǔ)公共實(shí)例變量(這在Objective-C從未使用過)。注意你可以通過如下改變這一設(shè)置:

  1. NSArray *array = (NSArray*)string; 

如果給數(shù)組發(fā)送消息,編譯器將會(huì)檢查NSArray能接收的消息。這并不是非常有用,因?yàn)閷?duì)象是一個(gè)字符串。如果發(fā)送一個(gè)NSArray和NSString實(shí)現(xiàn)的消息,可能會(huì)有作用。如果你發(fā)送的消息NSString沒有實(shí)現(xiàn),一個(gè)異常將會(huì)拋出。

強(qiáng)調(diào)Objective-C和C++的不同的這件事看起來比較奇怪。Objective-C有類型-值語法,而C++有類型-變量語法。在Objective-C,對(duì)象類型是對(duì)象專有的一種屬性。在C++,類型取決于變量的類型。

在C++中,當(dāng)你指派一個(gè)指針指向一個(gè)對(duì)象到一個(gè)變量定義一個(gè)指向父類的指針,兩個(gè)指針可能沒有相同的數(shù)值(這可以通過多繼承實(shí)現(xiàn),而Objective-C不支持這種。)

定義類

Objective-C類定義有一個(gè)接口和一個(gè)實(shí)現(xiàn)部分。與C++有相似的地方,但兩個(gè)稍微有些混。

Objective-C中的接口僅定義位并且明確的需要公開。對(duì)于實(shí)現(xiàn)的原因,這包括私有實(shí)例變量在大部分的實(shí)現(xiàn)中,因?yàn)槟銦o法繼承一個(gè)類除非你知道它多大。最近的一些實(shí)現(xiàn),象Apple的64位運(yùn)行時(shí)則沒有這種限制。

Objective-C對(duì)象的接口如下:

  1. @interface AnObject : NSObject  
  2.   
  3. {  
  4.   
  5. @private  
  6.   
  7. int integerivar  
  8.   
  9. @public  
  10.   
  11. id anotherObject;  
  12.   
  13. }  
  14.   
  15. + (id) aClassMethod;  
  16.   
  17. - (id) anInstanceMethod:(NSString*)aString with:(id)anObject  
  18.   
  19. @end 

***行包含3個(gè)部分。標(biāo)識(shí)符AnObject 是新類的名字。冒號(hào)后面的名字是NSObject。(這是可選的,但每一個(gè)Objective-C 對(duì)象都應(yīng)拓展NSObject)。在括號(hào)內(nèi)的名字是協(xié)議——與Java中的接口相似——通過類來實(shí)現(xiàn)。

正如C++實(shí)例變量(C++中的域)可以存取修飾符,不象C++,這些修飾符以@為前綴是為了避免與C標(biāo)識(shí)符沖突。

Objective-C不支持多繼承,所以只有一個(gè)父類。所以,對(duì)象***部分的布局總是與父類實(shí)例的布局一致。這在過去常常定義為動(dòng)態(tài),意味著改變 類中實(shí)例變量需要它所有子類重新編譯。在較新的運(yùn)行時(shí)這種限定并不要求,在存取實(shí)例實(shí)例變量上開支稍微大些。這種決策的另一個(gè)影響就是 Objective-C其他特性中的一個(gè)。

  1. struct_AnObject  
  2.   
  3. {  
  4.   @defs(AnObject);  
  5. }; 

@def表示著對(duì)特定對(duì)象所有域都插入這種結(jié)構(gòu),所以struct_AnObject 和AnObject類的實(shí)例有著相同的內(nèi)存結(jié)構(gòu)。舉個(gè)例子來說,你可以通過這種規(guī)則可以直接存取實(shí)例變量。一個(gè)通常的用法就是允許C函數(shù)直接操作 Objective-C對(duì)象,是基于性能原因。
正如我前面暗示的,與這個(gè)特性相關(guān)的另一件事就是可以在堆棧上創(chuàng)建對(duì)象。因?yàn)榻Y(jié)構(gòu)和對(duì)象在[FS:PAGE]內(nèi)存布局中有著相同的結(jié)構(gòu),你可以簡單的創(chuàng)建 結(jié)構(gòu),設(shè)置他的指針指向正確的類,然后映射一個(gè)指針指向一個(gè)對(duì)象指針。然后你可以當(dāng)做對(duì)象來使用,雖然你不得不小心沒有什么可以保持指針不越界。(現(xiàn)實(shí)世 界中我從沒有使用這種方法,僅僅理論上可能。)

不象C++,Objective-C沒有私有的或受保護(hù)的方法。Objective-C對(duì)象上的任何方法可以被其他對(duì)象調(diào)用。如果你在接口中沒有聲明方法,就是非正式私有的。將會(huì)得到運(yùn)行時(shí)警告:對(duì)象不回應(yīng)這種消息,但是你任然可以調(diào)用它。

接口和C中頭部聲明很相似。但它仍然需要一個(gè)實(shí)現(xiàn),這并不奇怪,可以使用@implementation來定義。

  1. @implementation AnObject  
  2. + (id) aClassMethod  
  3. {  
  4.     ...  
  5. }  
  6.  
  7. - (id) anInstanceMethod:(NSString*)aString with:(id)anObject  
  8. {  
  9.     ...  
  10. }  
  11. @end 

注意參數(shù)類型是特定的,在括號(hào)里。這是從C重用映射語法來展示值映射到類型;他們可能不是類型。準(zhǔn)確來說當(dāng)映射時(shí)應(yīng)用相同的規(guī)則。這意味著映射在不兼容對(duì)象指針類型間會(huì)導(dǎo)致一個(gè)警告(不是錯(cuò)誤)。

內(nèi)存管理

傳統(tǒng)的,Objective-C不提供任何內(nèi)存管理。在早期版本中,對(duì)象類實(shí)現(xiàn)一個(gè)+new方法調(diào)用malloc()來創(chuàng)建一個(gè)新對(duì)象。當(dāng)使用完這 個(gè)對(duì)象,傳一個(gè)-free消息。任何一個(gè)對(duì)象從NSObject繼承回應(yīng)一個(gè)-retain和-release消息。當(dāng)你使用完這個(gè)對(duì)象,你傳一個(gè) -free消息。OpenStep添加了參考計(jì)算。

每一個(gè)從NSObject繼承的對(duì)象都回應(yīng)-retain和-release消息。當(dāng)你想要保留一個(gè)指向?qū)ο蟮闹羔?,你可以發(fā)送一個(gè)-retain消息。當(dāng)你使用完以后,你可以發(fā)送一個(gè)-release消息。

這個(gè)設(shè)計(jì)有個(gè)細(xì)微問題。通常你不需要保持一個(gè)指向?qū)ο蟮闹羔?,但是你也不想釋放。一個(gè)典型的例子在返回一個(gè)對(duì)象時(shí)候,調(diào)用者需要保持指向?qū)ο蟮闹羔槪悴幌脒@么做。

這個(gè)問題的解決方案就是NSAutoreleasePool類。加上-retain和-release,NSObject也回應(yīng) -autorelease消息。當(dāng)你發(fā)送其中一個(gè),和現(xiàn)前的自動(dòng)釋放池一同注冊(cè)。當(dāng)這個(gè)池對(duì)象被注銷,它發(fā)送一個(gè)-release消息給每個(gè)對(duì)象,而對(duì)象 在這之前先收到-autorelease消息。在OpenStep應(yīng)用中,一個(gè)NSAutoreleasePool實(shí)例在循環(huán)開始的時(shí)候創(chuàng)建,在結(jié)束的時(shí) 候銷毀。你也可以創(chuàng)建屬于你自己的實(shí)例來自動(dòng)釋放對(duì)象。

這個(gè)機(jī)制減少了一些C++所需的復(fù)制。其實(shí)也不值得這么做,在Objective-C,易變性是對(duì)象的屬性,不是參考。在C++,有常量指針和非常量指針。不允許在常量對(duì)象上調(diào)用非常量方法。這保證不了對(duì)象不會(huì)被改變——僅僅因?yàn)槟悴幌敫淖儭?/p>

在Objective-C中,一個(gè)常態(tài)模式定義了一個(gè)不變的類和可變的子類。NSString就是一個(gè)典型例子;

它有一個(gè)可變的子類NSMutableString。如果你得到NSString并且想保存下來,你可以傳一個(gè)-retain消息并且不用復(fù)制操作 就可以保存指針。相反地,你可以傳一個(gè)+stringWithString:message給NSString。不管這個(gè)參數(shù)是否可變都會(huì)檢查并返回原始 指針。

在Apple和GNU運(yùn)行時(shí),Objective-C都支持存儲(chǔ)性的垃圾回收,這會(huì)避免對(duì)-retain和-release的需要。在現(xiàn)存的框架中對(duì)語言的附加并不總是很好的支持的,并且在用的時(shí)候需要格外小心。

總結(jié)

既然我們已經(jīng)瀏覽了Objective-C語言的核心,在這部分的總結(jié)我們將會(huì)看到更多的一些高級(jí)話題。

原文出處: 折酷吧  

責(zé)任編輯:閆佳明
相關(guān)推薦

2010-11-24 10:35:40

Objective-C

2011-05-11 13:54:08

Objective-C

2014-04-30 10:16:04

Objective-CiOS語法

2014-04-03 09:36:47

Objective-Cruby消息傳遞

2011-07-18 16:36:51

Objective-C XCode

2010-11-04 16:32:00

Objective-C

2015-06-25 11:21:33

C++Objective-C

2011-04-08 10:51:17

Objective-CiOS

2011-08-02 13:16:36

Objective-C 語法 函數(shù)

2011-05-11 11:20:26

Objective-C

2011-08-04 10:57:33

Objective-C C語言 BOOL

2011-05-11 14:06:49

Objective-C

2011-08-04 14:58:37

Objective-C Cocoa NSString

2013-08-21 14:57:42

objective-c問題

2011-08-04 13:38:01

Objective-C C++

2011-07-25 17:31:49

iPhone Objective-

2011-07-28 15:11:23

iOS Objective-

2011-07-07 17:04:33

iPhone Action Objective-

2011-07-18 14:59:20

iPhone Objective-

2012-12-26 09:51:52

C++開發(fā)者C++ CX
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)