objective-c2.0運(yùn)行時(shí)系統(tǒng)編程指南_第1頁(yè)
objective-c2.0運(yùn)行時(shí)系統(tǒng)編程指南_第2頁(yè)
objective-c2.0運(yùn)行時(shí)系統(tǒng)編程指南_第3頁(yè)
objective-c2.0運(yùn)行時(shí)系統(tǒng)編程指南_第4頁(yè)
objective-c2.0運(yùn)行時(shí)系統(tǒng)編程指南_第5頁(yè)
免費(fèi)預(yù)覽已結(jié)束,剩余13頁(yè)可下載查看

下載本文檔

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

文檔簡(jiǎn)介

1、Objective-C 2.0 運(yùn)行時(shí)系統(tǒng)編程指概本部分包括如下內(nèi)容Objective-C 運(yùn)行時(shí)。只要有可能,Objective-C Objective-CObjective-C 2.0 運(yùn)行時(shí)系統(tǒng)編程指概本部分包括如下內(nèi)容Objective-C 運(yùn)行時(shí)。只要有可能,Objective-C Objective-C 本文檔的組織結(jié) “類(lèi)型編碼“屬參 Objective-C 2.0 程序設(shè)計(jì)語(yǔ)言介紹了Objective-C語(yǔ)言本身 運(yùn)行時(shí)系統(tǒng)的版 本部分包含如下內(nèi)容早期版本和現(xiàn)行版關(guān)的新特性。早期版本的編程接本部分包含如下內(nèi)容早期版本和現(xiàn)行版關(guān)的新特性。早期版本的編程接口見(jiàn)Objective-C

2、 1 運(yùn)行時(shí)系統(tǒng)參考庫(kù);現(xiàn)行版本的編程接口見(jiàn)Objective-C 2.0 運(yùn)行時(shí)系統(tǒng)參考庫(kù)。此外,現(xiàn)行版本支property的synthesis屬性(參考Objective-C 程序設(shè)計(jì)語(yǔ)言的屬性一節(jié)) 和運(yùn)行時(shí)系統(tǒng)的 本部分包含如下內(nèi)容 通過(guò)Objective-C源代 結(jié)構(gòu)包含類(lèi)定義和協(xié)議類(lèi)定義中的信息,如在Objective-C 2.0 程序設(shè)計(jì)語(yǔ)言中定義類(lèi)和協(xié)議類(lèi)一節(jié)所通過(guò)類(lèi)NSObject的方了NSObject的行為。(NSProxy類(lèi)是個(gè)例外細(xì)節(jié)參考“消息轉(zhuǎn)發(fā)”一節(jié)。)然而,某些情況GDB-object方法就是直接打印出該方法返回的字符串。NSObject實(shí)現(xiàn)并不知道子類(lèi)中的內(nèi)容,

3、所以它只是返回類(lèi)的名字和對(duì)象的地址。NSObjectGDB-object方法就是直接打印出該方法返回的字符串。NSObject實(shí)現(xiàn)并不知道子類(lèi)中的內(nèi)容,所以它只是返回類(lèi)的名字和對(duì)象的地址。NSObject某些NSObject的方法只是簡(jiǎn)單地從運(yùn)行時(shí)系統(tǒng)中獲得信息,從而允許對(duì)象進(jìn)行一定程度的自我檢查。例如,class返回對(duì)象的類(lèi);isKindOfClass:isMemberOfClass:通過(guò)運(yùn)行時(shí)系統(tǒng)的函頭文件在/usr/include/objc中。這些函數(shù)支持用純 C 的函數(shù)來(lái)實(shí)現(xiàn)和 Objective-C 同樣的功能。有一些函了NSObject類(lèi)方法的基礎(chǔ)。這些函數(shù)使 數(shù)是非常有用的。 這

4、些函數(shù)的文檔參見(jiàn)Objective-C 2.0 運(yùn)行時(shí)系統(tǒng)參考庫(kù)消本章描述了代碼的消息表達(dá)式如何轉(zhuǎn)換為對(duì)objc_msgSend函數(shù)的調(diào)用,如何通過(guò)名字來(lái)指定一個(gè)方法,以及如何使用objc_msgSend函數(shù)。本部分包含如下內(nèi)容objcmsgSend函數(shù)獲得方法地利用NSObject類(lèi)中的methodForSelector:下面的例子展示了怎么使用指針來(lái)調(diào)用setFilled:void(*setter)(id,SEL,BOOL); setter = (void (*)(id, SEL, BOOL) 復(fù)發(fā)送很多次時(shí)才有意義,例如上面的for循環(huán)。objc_msgSend在 復(fù)發(fā)送很多次時(shí)才有意義

5、,例如上面的for循環(huán)。objc_msgSend在 類(lèi)的方法表。方法表將方法選標(biāo)和該類(lèi)的方法實(shí)現(xiàn)的地址關(guān)聯(lián)起來(lái)。例如,setOrigin:法選標(biāo)和setOrigin:的方法實(shí)現(xiàn)的地址關(guān)聯(lián),display的方法選標(biāo)和display的該對(duì)象的類(lèi)結(jié)構(gòu)的指針,叫做isa注意:Obective-C Objective-C isa指針。對(duì)象和結(jié)構(gòu)體struct objc_object(objc/objc.h中定義)必須“一致”。然而,您很少需要?jiǎng)?chuàng)建您自己的根對(duì)象,因?yàn)閺腘SObject或者NSProxy繼承的對(duì)象都自動(dòng)包括isa注意:編譯器將自調(diào)用該消息函數(shù)的代碼。您無(wú)須在代碼中顯示調(diào)用該消息函數(shù)objc

6、_msgSend(receiver,selector,arg1,arg2, receiverfor(i=0;i1000,i+3-13-該消息對(duì)應(yīng)的方法選標(biāo)。如果找不到,objc_msgSend3-13-該消息對(duì)應(yīng)的方法選標(biāo)。如果找不到,objc_msgSend將繼續(xù)從父類(lèi)中尋找,直到NSObject旦找到了方法選標(biāo), 使用隱藏的參量一樣)。在方法中可以通過(guò)self消息接收者對(duì)象,通過(guò)選標(biāo)_cmd例子中,_cmd指的是strange方法,self指的收到strange量一樣)。在方法中可以通過(guò)self消息接收者對(duì)象,通過(guò)選標(biāo)_cmd例子中,_cmd指的是strange方法,self指的收到str

7、ange動(dòng)態(tài)方本部分包含如下內(nèi)容動(dòng)態(tài)方 程序設(shè)計(jì)語(yǔ)言中屬性小節(jié))前的修飾符您可以通過(guò)實(shí)現(xiàn)resolveInstanceMethod:resolveClassMethod:來(lái)動(dòng)態(tài)地實(shí)現(xiàn)給定選標(biāo)dynamic-=getTheReceiver(); SEL method = getTheMethod();if (=self|method=_cmd) return nil;returnObjective-C方法可以認(rèn)為是至少有兩個(gè)參數(shù)self和_cmd 的C通常消息轉(zhuǎn)發(fā)(見(jiàn) “消息轉(zhuǎn)發(fā)”)Objective-C方法可以認(rèn)為是至少有兩個(gè)參數(shù)self和_cmd 的C通常消息轉(zhuǎn)發(fā)(見(jiàn) “消息轉(zhuǎn)發(fā)”)動(dòng)態(tài)加

8、模塊 盡管已經(jīng)有一個(gè)運(yùn)行時(shí)系統(tǒng)的函數(shù)來(lái)動(dòng)態(tài)加載Mach-O文件中的Objective-C模ion+if(aSEL=class_addMethod(selfclass,aSEL,(IMP)dynamicMethodIMP,v:); return YES;returnsupervoidself,SEL_cmd)/ion信息請(qǐng)參考Foundation框架中關(guān)于NSBundle類(lèi)的文檔。關(guān)于Mach-O文件的有關(guān)信息請(qǐng)參考MacOS ABI Mach-O 文件格式參考庫(kù)消息轉(zhuǎn) 信息請(qǐng)參考Foundation框架中關(guān)于NSBundle類(lèi)的文檔。關(guān)于Mach-O文件的有關(guān)信息請(qǐng)參考MacOS ABI Ma

9、ch-O 文件格式參考庫(kù)消息轉(zhuǎn) 本部分包含如下內(nèi)容 消息轉(zhuǎn)關(guān)于消息轉(zhuǎn)發(fā)的作用,您可以考慮如下情景:假設(shè),您需要設(shè)計(jì)一個(gè)能夠響應(yīng)negotiatenegotiate方法的實(shí)現(xiàn)中將negotiate消息在不同的繼承體系中響應(yīng)negotiate的將negotiate消息轉(zhuǎn)發(fā)給其他類(lèi)的對(duì)象,就好像從其它類(lèi)那兒“借”來(lái)的現(xiàn)一樣。如下所示:-if(someOtherObjectrespondsTo:selector(negotiate) return someOtherObject negotiate;returnforwardInvocation:相應(yīng)的方法實(shí)現(xiàn)而無(wú)法響應(yīng)某消息時(shí),運(yùn)行時(shí)系統(tǒng)將通過(guò)for

10、wardInvocation:個(gè)對(duì)象都從NObject類(lèi)中繼承了forwrdInvocation:方法。然而,NSObject只是簡(jiǎn)單地調(diào)用了doesNotRecognizeSelector:。通過(guò)實(shí)現(xiàn)您自己的forwardInvocation:forwardInvocation:相應(yīng)的方法實(shí)現(xiàn)而無(wú)法響應(yīng)某消息時(shí),運(yùn)行時(shí)系統(tǒng)將通過(guò)forwardInvocation:個(gè)對(duì)象都從NObject類(lèi)中繼承了forwrdInvocation:方法。然而,NSObject只是簡(jiǎn)單地調(diào)用了doesNotRecognizeSelector:。通過(guò)實(shí)現(xiàn)您自己的forwardInvocation:消息可以通過(guò)息,

11、或者簡(jiǎn)單的“某些消息,因此沒(méi)有響應(yīng)也沒(méi)有錯(cuò)誤。forwardInvocation:方法也可以對(duì)消息轉(zhuǎn)發(fā)的信息,參考Foundation 框架參考庫(kù)中NSInvocation消息轉(zhuǎn)發(fā)和多重繼5-1 注意forwardInvocation:如果您希望您的對(duì)象將negotiate消息轉(zhuǎn)發(fā)給其它對(duì)象,您的對(duì)象不能有negotiate if(someOtherObjectrespondsToSelector: anInvocation selector)anInvocation invokeWithsuper 類(lèi)響應(yīng)了該消息)消對(duì)Objective-C 2.0 程序設(shè)計(jì)語(yǔ)言中 類(lèi)響應(yīng)了該消息)消對(duì)Obj

12、ective-C 2.0 程序設(shè)計(jì)語(yǔ)言中同時(shí)也存在著其它類(lèi)型的消消息轉(zhuǎn)發(fā)和類(lèi)繼盡管消息轉(zhuǎn)發(fā)很“象”繼承,但它不是繼承。例如在NSObject類(lèi)中,方法respondsToSelector:詢(xún)問(wèn)它能否響應(yīng)negotiate 返回值是盡管消息轉(zhuǎn)發(fā)很“象”繼承,但它不是繼承。例如在NSObject類(lèi)中,方法respondsToSelector:詢(xún)問(wèn)它能否響應(yīng)negotiate 返回值是NO,盡管該對(duì)象能夠接收和響應(yīng)negotiate。(見(jiàn)5-1。除了respondsToSelector:isKindOfClass:方法也必須重新實(shí)現(xiàn)。如果您使用的是協(xié)議類(lèi),需要重新實(shí)現(xiàn)的還有conformsToPro

13、tocol:methodSignatureForSelector:-NSMethodSignature*signature=supermethodSignatureForSelector:selector; if (!signature) signature=surrogateif(superrespondsToSelector:aSelector) return YES;else/*Here,testwhethertheaSelectormessagebeforwardedtoanotherobjectandt objectcanrespondtoit.ReturnYESifitcan. r

14、eturnif(aWarriorrespondsToSelector:selector(negotiate)您也可以將消息轉(zhuǎn)發(fā)的部分放在一段私有的代碼里,然后從forwardInvocation:本節(jié)中涉及的方法在Foundation 框架參考庫(kù)中的NSObject:的具體信息,請(qǐng)參考Foundation 框架參考庫(kù)中NSInvocation類(lèi)型編為了和運(yùn)行時(shí)系統(tǒng)協(xié)作,編譯器將方法的返回類(lèi)型和參數(shù)類(lèi)型都編碼成一個(gè)字符串,并且和方法選標(biāo)關(guān)聯(lián)在一起。這些編碼在別的上下文環(huán)境中同樣有用,所以您可以直接使用encode()編譯指令來(lái)得到具體些編碼是您寫(xiě)您也可以將消息轉(zhuǎn)發(fā)的部分放在一段私有的代碼里,然后

15、從forwardInvocation:本節(jié)中涉及的方法在Foundation 框架參考庫(kù)中的NSObject:的具體信息,請(qǐng)參考Foundation 框架參考庫(kù)中NSInvocation類(lèi)型編為了和運(yùn)行時(shí)系統(tǒng)協(xié)作,編譯器將方法的返回類(lèi)型和參數(shù)類(lèi)型都編碼成一個(gè)字符串,并且和方法選標(biāo)關(guān)聯(lián)在一起。這些編碼在別的上下文環(huán)境中同樣有用,所以您可以直接使用encode()編譯指令來(lái)得到具體些編碼是您寫(xiě)的時(shí)候是6-1 Objective-C編含cislqlong Cunsigned ISunsigned char *buf1 = encode(char*buf2=encode(structkey);char

16、*buf3= returntypedefstructtypedefstructidanObject; 重要: Objective-C 不支持long double 類(lèi)型。 encongdouble)和double一樣,返signed Qunsigned long fdBC+bool或者C99 標(biāo)準(zhǔn)的v*字符串(char對(duì)象(無(wú)論是靜態(tài)指定的還是通過(guò)的#類(lèi):方法選標(biāo)arraynumbit?未知類(lèi)型(其它時(shí)候,一般用來(lái)指函數(shù)指針encode()NSObject注意,盡管有一些編碼無(wú)法從 屬時(shí)(參考Objective-C 2.0 程序設(shè)計(jì)encode()NSObject注意,盡管有一些編碼無(wú)法從 屬

17、時(shí)(參考Objective-C 2.0 程序設(shè)計(jì)語(yǔ)言中的屬性小節(jié)),編譯C字符串的數(shù)組返回等。每個(gè)類(lèi)或者協(xié)議類(lèi)了一了的屬性列6-2 Objective-C 編含rnNoORV本部分包含如下內(nèi)容 屬性類(lèi)型和相關(guān)函 本部分包含如下內(nèi)容 屬性類(lèi)型和相關(guān)函 例:您還可以通過(guò)property_getName函數(shù)class_getPropertyprotocol_getProperty:objc_property_tclass_getProperty(Classcls,constcharobjc_property_t protocol_getProperty(Protocol *proto, const

18、char *name, BOOL isRequiredProperty, BOOL isInstanceProperty)constchar*property_getName(objc_property_tidLenderClass=objc_getClass(Lender); erfaceLender:floatpropertyfloatalone; typedefstructobjc_property通過(guò)細(xì)節(jié),參考“類(lèi)型編碼“一節(jié);關(guān)于屬性的類(lèi)型編碼,見(jiàn)“屬性類(lèi)型編碼”及“屬性特征的描述范例”屬性類(lèi)型編通過(guò)細(xì)節(jié),參考“類(lèi)型編碼“一節(jié);關(guān)于屬性的類(lèi)型編碼,見(jiàn)“屬性類(lèi)型編碼”及“屬性特征的描述范例”屬性類(lèi)型編tributes返回的字符串以字母T開(kāi)始,接著是encode如果屬性有readonly 修飾,則字符串中含有R 如果屬性有copy或者retain修飾,則字符串分別含有C 或者&字符串以V

溫馨提示

  • 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)論