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!");
}
選擇器可以被傳遞,可以作為方法的參數使用,甚至可以作為執行個體變量被存儲。
利用這些特性,可以編寫一些非常強大和靈活的代碼!