Objective-C 動態綁定 學習筆記

動態綁定是指在運行程序時(而不是在編譯時)將消息與方法對應起來的處理過程。許多對象可能會實現相同的方法,調用方法的方式會動態的變化。因此,動態綁定實現了OOP的多態性。當然,通過動態綁定,因爲可以消除用於多選場景的條件邏輯,從而可以降低程序的複雜度。
動態綁定是Objective-C的一種繼承特性,它不需要任何特定的API。使用動態綁定可以將消息選擇器設置爲在運行程序時確定的變量。

使用:

@dynamic 可以告知編譯器與屬性關聯的方法會以動態方式實現。NSObject類中含有resolveInstanceMethod:和resolveClassMethod:方法,能夠以動態方式分別爲指定的實例和類方法選擇器提供給實現代碼。你可以重寫這些方法,以動態方式實現實例/類方法。例子:

+ (BOOL) resolveInstanceMethod:(SEL)sel {
    NSString *method = NSStringFromSelector(sel);
    if ([method hasPrefix:@"absoluteValue"]) {
        class_addMethod([self class], sel, (IMP)absoluteValue, "@@:@");
        NSLog(@"Dynamically added instance method %@ to class %@", method, [self class]);
    }

    return [super resolveInstanceMethod:sel];
}

id absoluteValue(id self, SEL _cmd, id value) {
    NSInteger intVal = [value integerValue];
    if (intVal < 0) {
        return [NSNumber numberWithInteger:(intVal * (-1))];
    }
    return value;
}

優點:

Objective-C程序通過動態加載功能可以根據需要加載可執行代碼和源代碼,而無須在程序啓動時加載程序的所有組件。這種程序代碼和數據資源的延遲加載方式可以提高程序的整體性能,因爲它降低了對系統內存的需求。
該方式還提高了程序的可擴展性,因爲能夠使新軟件在不更改已存在程序的情況下,以動態方式將新增代碼添加到程序中。比如動態方式加載軟件的包bundle。
包是一種軟件交付機制,由具有標準層次結構的目錄以及該目錄中的可執行代碼和源代碼構成。包可以包含可執行代碼、圖像、音頻文件和其他類型的代碼與資源數據。它還含有一個運行時配置文件,即信息屬性列表(info.plist)。包大致可以分爲以下幾類:

  • 應用程序包
  • 框架包
  • 可選加載包
//動態加載信息屬性列表
NSBundle *bundle = [NSBundle mainBundle];
NSString *bundlePath = [bundle pathForResource:@"Info" ofType:@"plist"];

//動態加載框架對象
NSBundle *bundle = [NSBundle mainBundle];
id test = [[[bundle classNamed:@"Test"] alloc] init];

內省

由於Objective-C運行時行爲與它編譯時和鏈接時行爲差異非常大,所以對象的內省就成爲了一種關鍵功能。這樣可以避免運行時錯誤,如消息分派錯誤、對對象想等的錯誤假設等。比如:

isKindOfClass:
respondsToSelector:
conformsToProtocol:
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章