C開發(fā)者快速學(xué)習(xí)Objective C語(yǔ)言核心語(yǔ)法_第1頁(yè)
C開發(fā)者快速學(xué)習(xí)Objective C語(yǔ)言核心語(yǔ)法_第2頁(yè)
C開發(fā)者快速學(xué)習(xí)Objective C語(yǔ)言核心語(yǔ)法_第3頁(yè)
C開發(fā)者快速學(xué)習(xí)Objective C語(yǔ)言核心語(yǔ)法_第4頁(yè)
C開發(fā)者快速學(xué)習(xí)Objective C語(yǔ)言核心語(yǔ)法_第5頁(yè)
已閱讀5頁(yè),還剩3頁(yè)未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

C++開發(fā)者快速學(xué)習(xí)Objective-C語(yǔ)言核心語(yǔ)法本文將Objective-C討論了語(yǔ)言的核心語(yǔ)法。將詳述一些具體的語(yǔ)法。正如你期待的一樣,涉及到了定義和類內(nèi)存管理等。本文將Objective-C討論了語(yǔ)言的核心語(yǔ)法。這部分開始詳述一些具體的語(yǔ)法。正如你期待的一樣,涉及到了定義和類。類并不是特殊的在Smalltalk中,類是具有一些特性的對(duì)象。在Objective-C中也一樣。一個(gè)類是一個(gè)對(duì)象,對(duì)象回應(yīng)消息。Objective-C和C++都分離了對(duì)象分配和初始化。在C++中,對(duì)象分配通過(guò)新的操作。在Objective-C中,這樣的操作是通過(guò)給類發(fā)送分配消息—調(diào)用malloc()或者一個(gè)等價(jià)。C++中的初始化是通過(guò)調(diào)用一個(gè)與類同名的函數(shù)。Objective-C并沒(méi)有區(qū)別初始化方法和其他方法,但出于慣例缺省的初始化方法就是初始化。當(dāng)你聲明一個(gè)方法讓實(shí)例去回應(yīng),聲明通常已“-”開頭,并且“+”用作類的方法。在文檔中對(duì)這些消息使用一些前綴是很普遍的,所以你也可以說(shuō)+alloc和-init來(lái)暗示alloc是傳給一個(gè)類,init傳給實(shí)例。類在Objective-C中,正如在其他一些面向?qū)ο笳Z(yǔ)言,都是對(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來(lái)實(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)建語(yǔ)義是由庫(kù)定義的并且語(yǔ)言不是類簇的思想。當(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í)通過(guò)分配新值來(lái)改變對(duì)象的類。當(dāng)然,如果你對(duì)對(duì)象的類設(shè)置在內(nèi)存中有著不同的布局,這些設(shè)置可能嚴(yán)重錯(cuò)誤。然而,你可以通過(guò)一個(gè)父類來(lái)定義布局和通過(guò)子集的集合定義行為,舉例來(lái)說(shuō),這個(gè)技術(shù)用在標(biāo)準(zhǔn)化字符串類(NSString),它對(duì)不同的文本字符集、靜態(tài)事物和其它一些有著各種各樣的實(shí)例。因?yàn)轭愂菍?duì)象,你可以象操作對(duì)象一樣操作他們。舉例來(lái)說(shuō),你可以把他們放在集合。當(dāng)我有一些輸入事件需要通過(guò)不同的類的實(shí)例來(lái)處理時(shí)我就使用這種格式。你需要?jiǎng)?chuàng)建一個(gè)目錄映射事件命名到類,然后為每一個(gè)輸入事件實(shí)例化一個(gè)對(duì)象。如果你在一個(gè)庫(kù)中這么做,它允許代碼的使用者輕松的注冊(cè)屬于他們自己的句柄。類型和指針Objective-C沒(méi)有公開允許在堆棧上定義對(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語(yǔ)言中的void*,你可以映射任何對(duì)象指針類型指向它并且映射他指向其它的對(duì)象指針類型。你可以傳任何消息給id,但如果不支持的話會(huì)返回一個(gè)運(yùn)行時(shí)異常。類是指向Objective-C類的指針。類是對(duì)象,所以也可以接收消息。類名是一種類型,不是可變的。標(biāo)識(shí)符NSObject是一個(gè)NSObject實(shí)例的類型,但也可作為消息接受者。你可以獲得一個(gè)類,如下:[NSObject

class];

發(fā)送一個(gè)+class消息給NSObject類,然后返回一個(gè)指向代表類的類結(jié)構(gòu)指針。這對(duì)我們回顧是非常有用的[FS:PAGE],正如我們?cè)谶@個(gè)系列第二部分看到的一樣。第三種類型SEL,代表一個(gè)選擇器—一個(gè)代表方法名的抽象。你可以在編譯時(shí)通過(guò)@selector()直接創(chuàng)建,或在運(yùn)行時(shí)通過(guò)C字符串調(diào)用運(yùn)行時(shí)庫(kù)函數(shù),或用OpenStepNSSelectorFromString()函數(shù),這個(gè)函數(shù)給Objective-C字符串一個(gè)選擇器。這個(gè)技術(shù)允許你通過(guò)名字調(diào)用方法。你可以在C中通過(guò)使用類似dlsym(),但在C++中非常不同。在Objective-C中,你可以做的如下:[object

perfomSelector:@selector(doSomething)];

這等價(jià)于如下:[object

doSomething];

顯然,第二種格式速度稍微快些,因?yàn)榈谝环N傳送兩個(gè)消息。后面,我們會(huì)看到通過(guò)選擇器處理的一些細(xì)節(jié)。C++沒(méi)有與id相同的類型。因?yàn)閷?duì)象總是可以類型化的。在Objective-C,你可以選擇類型系統(tǒng)。下面的兩種都是有效的:id

object

=

@”a

string”;

NSString

*string

=

@”a

string”;

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

*array

=

(NSArray*)string;

如果給數(shù)組發(fā)送消息,編譯器將會(huì)檢查NSArray能接收的消息。這并不是非常有用,因?yàn)閷?duì)象是一個(gè)字符串。如果發(fā)送一個(gè)NSArray和NSString實(shí)現(xiàn)的消息,可能會(huì)有作用。如果你發(fā)送的消息NSString沒(méi)有實(shí)現(xiàn),一個(gè)異常將會(huì)拋出。強(qiáng)調(diào)Objective-C和C++的不同的這件事看起來(lái)比較奇怪。Objective-C有類型-值語(yǔ)法,而C++有類型-變量語(yǔ)法。在Objective-C,對(duì)象類型是對(duì)象專有的一種屬性。在C++,類型取決于變量的類型。在C++中,當(dāng)你指派一個(gè)指針指向一個(gè)對(duì)象到一個(gè)變量定義一個(gè)指向父類的指針,兩個(gè)指針可能沒(méi)有相同的數(shù)值(這可以通過(guò)多繼承實(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(wú)法繼承一個(gè)類除非你知道它多大。最近的一些實(shí)現(xiàn),象Apple的64位運(yùn)行時(shí)則沒(méi)有這種限制。Objective-C對(duì)象的接口如下:@interface

AnObject

:

NSObject

{

@private

int

integerivar

@public

id

anotherObject;

}

+

(id)

aClassMethod;

-

(id)

anInstanceMethod:(NSString*)aString

with:(id)anObject

@end

第一行包含3個(gè)部分。標(biāo)識(shí)符AnObject是新類的名字。冒號(hào)后面的名字是NSObject。(這是可選的,但每一個(gè)Objective-C對(duì)象都應(yīng)拓展NSObject)。在括號(hào)內(nèi)的名字是協(xié)議——與Java中的接口相似——通過(guò)類來(lái)實(shí)現(xiàn)。正如C++實(shí)例變量(C++中的域)可以存取修飾符,不象C++,這些修飾符以@為前綴是為了避免與C標(biāo)識(shí)符沖突。Objective-C不支持多繼承,所以只有一個(gè)父類。所以,對(duì)象第一部分的布局總是與父類實(shí)例的布局一致。這在過(guò)去常常定義為動(dòng)態(tài),意味著改變類中實(shí)例變量需要它所有子類重新編譯。在較新的運(yùn)行時(shí)這種限定并不要求,在存取實(shí)例實(shí)例變量上開支稍微大些。這種決策的另一個(gè)影響就是Objective-C其他特性中的一個(gè)。struct_AnObject

{

@defs(AnObject);

};

@def表示著對(duì)特定對(duì)象所有域都插入這種結(jié)構(gòu),所以struct_AnObject和AnObject類的實(shí)例有著相同的內(nèi)存結(jié)構(gòu)。舉個(gè)例子來(lái)說(shuō),你可以通過(guò)這種規(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),你可以簡(jiǎn)單的創(chuàng)建結(jié)構(gòu),設(shè)置他的指針指向正確的類,然后映射一個(gè)指針指向一個(gè)對(duì)象指針。然后你可以當(dāng)做對(duì)象來(lái)使用,雖然你不得不小心沒(méi)有什么可以保持指針不越界。(現(xiàn)實(shí)世界中我從沒(méi)有使用這種方法,僅僅理論上可能。)不象C++,Objective-C沒(méi)有私有的或受保護(hù)的方法。Objective-C對(duì)象上的任何方法可以被其他對(duì)象調(diào)用。如果你在接口中沒(méi)有聲明方法,就是非正式私有的。將會(huì)得到運(yùn)行時(shí)警告:對(duì)象不回應(yīng)這種消息,但是你任然可以調(diào)用它。接口和C中頭部聲明很相似。但它仍然需要一個(gè)實(shí)現(xiàn),這并不奇怪,可以使用@implementation來(lái)定義。@implementation

AnObject

+

(id)

aClassMethod

{

...

}

-

(id)

anInstanceMethod:(NSString*)aString

with:(id)anObject

{

...

}

@end

注意參數(shù)類型是特定的,在括號(hào)里。這是從C重用映射語(yǔ)法來(lái)展示值映射到類型;他們可能不是類型。準(zhǔn)確來(lái)說(shuō)當(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()來(lái)創(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ū)ο蟮闹羔槪憧梢园l(fā)送一個(gè)-retain消息。當(dāng)你使用完以后,你可以發(fā)送一個(gè)-release消息。這個(gè)設(shè)計(jì)有個(gè)細(xì)微問(wèn)題。通常你不需要保持一個(gè)指向?qū)ο蟮闹羔?,但是你也不想釋放。一個(gè)典型的例子在返回一個(gè)對(duì)象時(shí)候,調(diào)用者需要保持指向?qū)ο蟮闹羔?,但你不想這么做。這個(gè)問(wèn)題的解決方案就是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í)例來(lái)自動(dòng)釋放對(duì)象。這個(gè)機(jī)制減少了一些C++所需的復(fù)制。其實(shí)也不值得這么做,在Objective-C,易變性是對(duì)象的屬性,不是參考。在C++,有常量指針和非常量指針。不允許在常量對(duì)象上調(diào)用非常量方法。這保證不了對(duì)象不會(huì)被改變——僅僅因?yàn)槟悴幌敫淖?。在Objective-C中,一個(gè)常態(tài)模式定義了一個(gè)不變的類和可變的子類。NSString就是一個(gè)典型例子;它有一個(gè)可變的子類NSMutableString。如果你得到NSString并

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論