翻譯:Objective-C運行時編程指南(四)——動態(tài)方法解析(Dynamic Method Resolution)

本章描述了如何動態(tài)的提供一個方法的實現(xiàn)巷燥。

動態(tài)方法解析

在有些情況下倔撞,需要動態(tài)的提供一個方法的實現(xiàn)寸士。例如渤愁,Objective-C 聲明的屬性特征(見Objective-C 編程語言中的聲明屬性)包含@dynamic指令:
<pre><code>@dynamic propertyName; </pre></code>

它告訴編譯器牵祟,將動態(tài)的提供該方法與屬性。
可以實現(xiàn)resolveInstanceMethod: 和resolveClassMethod: 方法來動態(tài)的提供一個給定選擇器的實例和對應的類方法提供實現(xiàn)抖格。
一個Objective-C 方法僅僅是一個至少有兩個參數(shù)self和_cmd的C函數(shù)诺苹。可以添加在類中添加一個函數(shù)作為一個使用class_addMethod.函數(shù)的方法雹拄。因此收奔,有以下函數(shù):
<pre><code>
void dynamicMethodIMP(id self, SEL _cmd) {

// implementation ....

}
</pre></code>

可以動態(tài)的將它添加到類中作為一個使用 resolveInstanceMethod: 的方法(稱為resolveThisMethodDynamically):
<pre><code>
@implementation MyClass

  • (BOOL)resolveInstanceMethod:(SEL)aSEL

{

if (aSEL == @selector(resolveThisMethodDynamically)) {

      class_addMethod([self class], aSEL, (IMP) dynamicMethodIMP, "v@:");

      return YES;


}

return [super resolveInstanceMethod:aSEL];

}

@end
</pre></code>

轉發(fā)方法(消息轉發(fā))和動態(tài)方法解析很大程度上是正交的。一個類有機會在轉發(fā)機制開始工作前動態(tài)解析方法滓玖。如果調用respondsToSelector: 或instancesRespondToSelector:坪哄,動態(tài)方法解析器會為選擇器提供IMP。如果實現(xiàn)resolveInstanceMethod: ,但實際上想通過轉發(fā)機制來轉發(fā)特定的選擇器翩肌,將返回NO模暗。

動態(tài)加載

一個Objective-C程序可以在運行過程中加載和鏈接新類和分類。程序中納入新代碼念祭,在開始加載的類和類別中都可以使用兑宇。

動態(tài)加載可以用來做很多不同的事情。例如粱坤,系統(tǒng)偏好設置應用程序中的模塊都是動態(tài)加載的隶糕。

在Cocoa 環(huán)境中,動態(tài)加載通常用來自定義應用程序站玄。其他人可以編寫模塊讓你的程序在運行時加載枚驻,類似IB加載自定義調色板和OS X系統(tǒng)設置應用程序加載自定義偏好模塊⊙咽玻可加載模塊可擴展應用程序测秸。他們以你允許的方式貢獻代碼疤估,但是不能自己預計和定義灾常。你提供框架,其他人提供代碼铃拇。

盡管有一個運行時函數(shù)在Mach-O 文件(在objc/objc-load.h中定義的objc_loadModules)中钞瀑,執(zhí)行 Objective-C 模塊的動態(tài)加載。Cocoa的NSBundle 類為動態(tài)加載提供了更方便的接口慷荔,這個接口是面向對象并與相關服務結合雕什。了解NSBundle 類信息和使用,可參閱基礎框架引用中的NSBundle 類規(guī)范显晶。Mach-O 文件信息可查看OS X ABI Mach-O文件格式引用贷岸。

官方原文地址:

https://developer.apple.com/library/ios/documentation/Cocoa/Conceptual/ObjCRuntimeGuide/Articles/ocrtDynamicResolution.html#//apple_ref/doc/uid/TP40008048-CH102-SW1

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市磷雇,隨后出現(xiàn)的幾起案子偿警,更是在濱河造成了極大的恐慌,老刑警劉巖唯笙,帶你破解...
    沈念sama閱讀 222,252評論 6 516
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件螟蒸,死亡現(xiàn)場離奇詭異,居然都是意外死亡崩掘,警方通過查閱死者的電腦和手機七嫌,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,886評論 3 399
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來苞慢,“玉大人诵原,你說我怎么就攤上這事。” “怎么了绍赛?”我有些...
    開封第一講書人閱讀 168,814評論 0 361
  • 文/不壞的土叔 我叫張陵鞋拟,是天一觀的道長。 經常有香客問我惹资,道長贺纲,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 59,869評論 1 299
  • 正文 為了忘掉前任褪测,我火速辦了婚禮猴誊,結果婚禮上,老公的妹妹穿的比我還像新娘侮措。我一直安慰自己懈叹,他們只是感情好,可當我...
    茶點故事閱讀 68,888評論 6 398
  • 文/花漫 我一把揭開白布分扎。 她就那樣靜靜地躺著澄成,像睡著了一般。 火紅的嫁衣襯著肌膚如雪畏吓。 梳的紋絲不亂的頭發(fā)上墨状,一...
    開封第一講書人閱讀 52,475評論 1 312
  • 那天,我揣著相機與錄音菲饼,去河邊找鬼肾砂。 笑死,一個胖子當著我的面吹牛宏悦,可吹牛的內容都是我干的镐确。 我是一名探鬼主播,決...
    沈念sama閱讀 41,010評論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼饼煞,長吁一口氣:“原來是場噩夢啊……” “哼源葫!你這毒婦竟也來了?” 一聲冷哼從身側響起砖瞧,我...
    開封第一講書人閱讀 39,924評論 0 277
  • 序言:老撾萬榮一對情侶失蹤息堂,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后芭届,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體储矩,經...
    沈念sama閱讀 46,469評論 1 319
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 38,552評論 3 342
  • 正文 我和宋清朗相戀三年褂乍,在試婚紗的時候發(fā)現(xiàn)自己被綠了持隧。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,680評論 1 353
  • 序言:一個原本活蹦亂跳的男人離奇死亡逃片,死狀恐怖屡拨,靈堂內的尸體忽然破棺而出只酥,到底是詐尸還是另有隱情,我是刑警寧澤呀狼,帶...
    沈念sama閱讀 36,362評論 5 351
  • 正文 年R本政府宣布裂允,位于F島的核電站,受9級特大地震影響哥艇,放射性物質發(fā)生泄漏绝编。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 42,037評論 3 335
  • 文/蒙蒙 一貌踏、第九天 我趴在偏房一處隱蔽的房頂上張望十饥。 院中可真熱鬧,春花似錦祖乳、人聲如沸逗堵。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,519評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽蜒秤。三九已至,卻和暖如春亚斋,著一層夾襖步出監(jiān)牢的瞬間作媚,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,621評論 1 274
  • 我被黑心中介騙來泰國打工伞访, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留掂骏,地道東北人轰驳。 一個月前我還...
    沈念sama閱讀 49,099評論 3 378
  • 正文 我出身青樓厚掷,卻偏偏與公主長得像,于是被迫代替她去往敵國和親级解。 傳聞我的和親對象是個殘疾皇子冒黑,可洞房花燭夜當晚...
    茶點故事閱讀 45,691評論 2 361

推薦閱讀更多精彩內容