0x01 非正式協議
“非正式協議”(Informal Protocol)可以視爲“類別”的別稱,即凡是NSObject或其子類的類別,都是“非正式協議”。
可以從Apple官方的開發者文檔看到:
1、非正式協議中的方法是否實現是可選的,因此在調用非正式協議中的方法之前,需要去檢查對象類是否實現了它;
2、在Objective-C 2.0中引入可選的正式協議方法之前,非正式協議是Foundation和AppKit類實現委託的唯一方式。
0x02 響應選擇器
選擇器(Selector)只是一個方法名稱,但它以Objective-C運行時使用的特殊方式編碼,以快速執行查詢。
可以使用@selector()編譯指令圓括號中的方法名稱來指定選擇器:
//The selector for the Car method setEngine:
@selector(setEngine:)
//The selector for the setTire:atIndex:
@selector(setTire:atIndex:)
NSObject提供了一個名爲respondsToSelector:的方法,該方法詢問對象以確定其是否能夠響應某個特定的消息:
Car *car = [[Car alloc] init];
if ([car respondsToSelector: @selector(setEngine:)]) //如果Car類對象存在setEngine:方法,則執行以下代碼
{
NSLog (@"yowza!");
}
選擇器可以被傳遞,可以作爲方法的參數使用,甚至可以作爲實例變量被存儲。
利用這些特性,可以編寫一些非常強大和靈活的代碼!