天天看點

Objective-C的非正式協定(Informal Protocol)和選擇器(Selector)0x01 非正式協定0x02 響應選擇器

0x01 非正式協定

“非正式協定”(Informal Protocol)可以視為“類别”的别稱,即凡是NSObject或其子類的類别,都是“非正式協定”。

Objective-C的非正式協定(Informal Protocol)和選擇器(Selector)0x01 非正式協定0x02 響應選擇器

可以從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!");
}           

選擇器可以被傳遞,可以作為方法的參數使用,甚至可以作為執行個體變量被存儲。

利用這些特性,可以編寫一些非常強大和靈活的代碼!