Dynamic Method Resolution(文檔翻譯)

本節講述怎樣動態的為一個方法提供方法實現

Dynamic Method Resolution

在某些情況下,你也許想動態的提供一個方法實現。例如,Objective-C聲明屬性時使用@dynamic指令

@dynamic propertyName;

這條指令告訴編譯器和該屬性相關的方法將動態的提供。

你可以實現resolveInstanceMethod:或者resolveClassMethod:來動態的為一個實例方法或者類方法提供實現

一個Objective-C方法就是一個至少含有self和_cmd兩個參數的C函數。運用class_addMethod函數,你可以把一個函數轉換為為一個類的新方法。因此,對于下面的函數

void dynamicMethodIMP(id self, SEL _cmd) {

// implementation ....

}

我們可以通過resolveInstanceMethod:方法,動態的將上面這個函數轉換為一個類的新方法(這里命名為resolveThisMethodDynamically),如下:

@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

一個類可以有機會在轉發機制(forwarding mechanism)觸發前動態的處理方法實現。如果調用respondsToSelector: 或者instancesRespondToSelector:,那么動態方法可以為選擇器先提供一個IMP。如果你實現了resolveInstanceMethod:方法,但是卻希望某些選擇器通過轉發機制實現,那么你只需在相應的選擇器下設置返回值為NO。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容

  • 轉至元數據結尾創建: 董瀟偉,最新修改于: 十二月 23, 2016 轉至元數據起始第一章:isa和Class一....
    40c0490e5268閱讀 1,788評論 0 9
  • 本文詳細整理了 Cocoa 的 Runtime 系統的知識,它使得 Objective-C 如虎添翼,具備了靈活的...
    lylaut閱讀 826評論 0 4
  • 我們常常會聽說 Objective-C 是一門動態語言,那么這個「動態」表現在哪呢?我想最主要的表現就是 Obje...
    Ethan_Struggle閱讀 2,232評論 0 7
  • 轉載:http://yulingtianxia.com/blog/2014/11/05/objective-c-r...
    F麥子閱讀 772評論 0 2
  • 本文轉載自:http://yulingtianxia.com/blog/2014/11/05/objective-...
    ant_flex閱讀 799評論 0 1