objective20運行時系統(tǒng)編程指南_第1頁
objective20運行時系統(tǒng)編程指南_第2頁
objective20運行時系統(tǒng)編程指南_第3頁
objective20運行時系統(tǒng)編程指南_第4頁
objective20運行時系統(tǒng)編程指南_第5頁
已閱讀5頁,還剩13頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

Objective-C2.0Objective-C語言將決定盡可能的從編譯和時推運行時。只要有可能,Objective-C總是使用動態(tài)Objective-C語言不僅需要一個編譯器,同時也需要一個運行時系統(tǒng)來執(zhí)行“消息 ——GDBprint-object方法就是直接打印出該方法返回的字符串。NSObject類中該方法的實現(xiàn)并不知道子類中的內(nèi)容,所以它只是返回類的名字和對象的地址。NSObject的子類可以重新實現(xiàn)某些NSObject的方法只是簡單地從運行時系統(tǒng)中獲得信息,從而允許對象進行一定程度的自我檢查。運行時系統(tǒng)是一個有公開接口的動態(tài)庫,由一些數(shù)據(jù)結(jié)構(gòu)和函數(shù)的集合組成,這些數(shù)據(jù)結(jié)構(gòu)和函數(shù)的有一些函數(shù)構(gòu)成了NSObject類方法的基礎(chǔ)。這些函數(shù)使得運行時系統(tǒng)接口和提供開發(fā)工具成為可數(shù)是非常有用的。這些函數(shù)的文檔參見Objective-C2.0運行時系統(tǒng)參考庫。本章描述了代碼的消息表達式如何轉(zhuǎn)換為對objc_msgSend函數(shù)的調(diào)用,如何通過名字來指定一個方法,以及如何使用objc_msgSend函數(shù)。objcmsgSend函數(shù)避免動態(tài)綁定的唯一辦法就是取得方法的地址,并且直接象函數(shù)調(diào)用一樣調(diào)用它。當(dāng)一個方被連續(xù)調(diào)利用NSObject類中的methodForSelector:方法,您可以獲得一個指向方法實現(xiàn)的指針,并可以下面的例子展示了怎么使用指針來調(diào)用setFilled:voidvoid(*setter)(id,SEL,BOOL);inti;setter=(void(*)(id,SEL,BOOL))[targetforfor(i=0;i<1000,i++使用methodForSelector:來避免動態(tài)綁定將減少大部分消息的開銷,但是這只有在指定的消息被重復(fù)發(fā)送很多次時才有意義,例如上面的for循環(huán)。注意,methodForSelector:Cocoa運行時系統(tǒng)的提供的功能,而不是Objective-C語言本身的功 法選標和setOrigin::的方法實現(xiàn)的地址關(guān)聯(lián),disy的方法選標和disy的 注意:注意:Obective-CObjective-Cisa指針。對象和結(jié)構(gòu)體structobjc_object(在objc/objc.h中定義)必須“一致”。然而,您很少需要創(chuàng)建您自己的根對象,因為從NSObject或者 繼承的對象都自動包括isa變量3-13-1旦找到了方法選標,objc_msgSend則以消息接收者對象為參數(shù)調(diào)用,調(diào)用該選標對應(yīng)的方法實現(xiàn)。源代碼中,而是在代碼編譯時是插入方法的實現(xiàn)中的。盡管這些參數(shù)沒有被顯示,但在源代碼中仍然可以它們(就象可以消息接收者對象的實例變量一樣)。在方法中可以通過self來消息接收者對象,通過選標_cmd來方法本身。在下面的例子中,_cmd指的是strange方法,self指的收到strange消息的對象。--{idtarget=getTheReceiver();SELmethod=getTheMethod();if(target==self||method==_cmd)returnnil;return[target}@dynamic@dynamic您可以通過實現(xiàn)resolveInstanceMethod:resolveClassMethod:來動態(tài)地實現(xiàn)給定選標Objective-C方法可以認為是至少有兩個參數(shù)——self和_cmd——的CvoidvoiddynamicMethodIMP(idself,SEL_cmd)//implementation}您可以通過resolveInstanceMethod:將它作為類方法resolveThisMethodDynamically+{if(aSEL=={class_addMethod([selfclass],aSEL,(IMP)dynamicMethodIMP,"v@:");returnYES;}return[super}通常消息轉(zhuǎn)發(fā)(見“消息轉(zhuǎn)發(fā)”)和動態(tài)方法解析是互不相干的。在進入消息轉(zhuǎn)發(fā)機制之前,您的方式擴展了您的程序,而您無需自己來定義或者實現(xiàn)。您提供了框架,而其它的程序員提供了實信息請參考Foundation框架中關(guān)于NSBundle類的文檔。關(guān)于Mach-O文件的有關(guān)信息請參考MacOSXABIMach-O文件格式參考庫。關(guān)于消息轉(zhuǎn)發(fā)的作用,您可以考慮如下情景:假設(shè),您需要設(shè)計一個能夠響應(yīng)negotiate消息的對象,并且能夠包括其它類型的對象對消息的響應(yīng)。通過在negotiate方法的實現(xiàn)中將negotiate消息在不同的繼承體系中響應(yīng)negotiate消息。的將negotiate消息轉(zhuǎn)發(fā)給其他類的對象,就好像從其它類那兒“借”來的現(xiàn)一樣。如下所示:--{if([someOtherObjectrespondsTo:@selector(negotiate)])return[someOtherObjectnegotiate];return}然而,實際上,這個集合會隨著運行件的發(fā)生,新方法或者新類的定義而變化。forwardInvocation:fowardInvocation:個對象都從NSObject類中繼承了forwardInvocatin:NSObject只是簡單地調(diào)用了doesNotRecognizeSelector:。通過實現(xiàn)您自己的forwardInvocation:消息可以通過invokeWithTarget:{if([someOtherObjectrespondsToSelector:[anInvocationselector]])[super}forwardInvocation:如果您希望您的對象將negotiate消息轉(zhuǎn)發(fā)給其它對象,您的對象不能有negotiate消息轉(zhuǎn)發(fā)的信息,參考Foundation框架參考庫中NSInvocation5-1看起來同時繼承自Diplomat和自己的父類。發(fā)給消息接收對象的管理細節(jié),保證消息參數(shù)的傳輸?shù)鹊?。但是消息類沒有進一步的對象的同時也存在著其它類型的消息對象。例如,假設(shè)您有個對象需要操作大量的數(shù)據(jù)——它可能需要創(chuàng)建一個復(fù)雜的或者需要從磁盤上讀一個文件的內(nèi)容。創(chuàng)建一個這樣的對象是很費時的,您可能希望能推在這種情況下,你可以為該對象創(chuàng)建一個輕量的對象。該對象可以有一些自己的功能,例如響應(yīng)數(shù)據(jù)查詢消息,但是它主要的功能是代表某個對象,當(dāng)時間到來時,將消息轉(zhuǎn)發(fā)給被代表的對象。當(dāng)對象的forwardInvocation:方法收到需要轉(zhuǎn)發(fā)給被代表的對象的消息時,對象會保證所代表的對象已經(jīng)存在,否則就創(chuàng)建它。所有發(fā)到被代表的對象的消息都要經(jīng)過對象,對程序來說,對象盡管消息轉(zhuǎn)發(fā)很“象”繼承,但它不是繼承。例如在NSObject類中,方法respondsToSelector:詢問它能否響應(yīng)negotiate消息,返回值是NO,盡管該對象能夠接收和響應(yīng)negotiate。(5-1。--{if([superrespondsToSelector:aSelector])returnYES;else/*Here,testwhethertheaSelectormessage*beforwardedtoanotherobjectandwhetherthatobjectcanrespondtoit.ReturnYESifitcan.}return}除了respondsToSelector:和isKindOfClass:外,instancesRespondToSelector:方法也必須重新實現(xiàn)。如果您使用的是協(xié)議類,需要重新實現(xiàn)的還有conformsToProtocol:方法。mtodintreoSeetor--{NSMethodSignature*signature=[supermethodSignatureForSelector:selector];if(!signature){signature=[surrogate}}return}本節(jié)中涉及的方法在Foundation框架參考庫中的NSObjectinvokeWithTarget:的具體信息,請參考Foundation框架參考庫中NSInvocation在一起。這些編碼在別的上下文環(huán)境中同樣有用,所以您可以直接使用@encode@encode(Csizof()char*buf1=@encode(int**);charchar*buf1=@encode(int**);char*buf2=@encode(structkey);char*buf3=些編碼是您寫編時候不會使用的,也有一些不是@encode()產(chǎn)生的,但是在您寫編的時候是會6-1Objective-CcislqlongCunsignedIunsignedSunsignedLunsignedQunsignedlongfdBC++標準的boolC99標準的v*字符串(char@對象(無論是靜態(tài)指定的還是通過id的#類:[arraynumbit?Objective-C不支持longdouble@encode(longdouble)double一樣,返一個12個浮點數(shù)(floats)指針的數(shù)組可以表示如下:typedeftypedefstruct{idintanInt;}} @encode()NSObject@encode()的結(jié)果中直接得到,但是運行時系統(tǒng)會使用它們來表示協(xié)議類中方法的修飾符,這些編碼如表6-2所示。6-2Objective-CrnNoORVtypedeftypedefstructobjc_property @interfaceLender:{float}@propertyfloatalone;ididLenderClass=objc_getClass("Lender");unsignedintoutCount;您還可以通過property_getName函數(shù)class_getProperty和protocol_getProperty則在類或者協(xié)議類中返回具有給定名字 objc_property_tprotocol_getProperty(Protocol*proto,constchar*name,BOOLisRequiredProperty,BOOLisInstanceProperty)ididLenderClass=objc_getClass("Lender");unsignedintoutCount,i;objc_property_t*properties=class_copyPropertyList(LenderClass,&outCount);for(i=0;i<outCount;i++){objc_property_tproperty=}property_getAttributes返回的字符串以字母T開始,接著是@encode如果屬性有readonly修飾,則字符串中含有R如果屬性有copy或者retain修飾,則字符串分別含有C或者&字符串以V然后是屬性的名字結(jié)束。范例請參考“屬性特征的描述范例”一節(jié)。enumenumFooManChu{FOO,MAN,CHUstructYorkshireTeaStruct{intpot;charlady;};typedefstructYorkshireTeaStructYorkshireTeaStructType;unionMoneyUnion{floatalone;doubledown;};@propertychar @propertyfloat@pr

溫馨提示

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

評論

0/150

提交評論