作者:ani_di
版權所有,轉載務必保留此鏈接 http://blog.csdn.net/ani_di
Objective-C協議淺析與使用
協議(Protocol)是ObjC 2.0新增的特性。它可以簡單的理解爲一組方法聲明,而定義交給使用者去實現,與C++或Java中的純抽象類相似。 以ObjC強大的動態性,沒有協議同樣可以達到類似的效果。使用協議有以下優勢:
* 顯示聲明要求的方法,便於交流
* 利用編譯器幫助檢查
* 減少不必要的容錯
協議往往和委託(delegate)伴隨使用。這與協議的使用場景有關:協議是一份要求其他類實現的接口,而委託是調用這些實現的途徑。
程序之間的遠程對象調用也需要協議,這個用的比較少。
理解了協議是純抽象類或接口類,那麼使用起來就容易多了。
@protocol MyIsOK
//method declarations
- (BOOL)isOK;
@end
協議的聲明類似於class,需要一個協議名,定義一些方法(可以沒有),但不能定義ivars。還可以用的一些關鍵字,比如@optional, @required,也是非必須的。然後就不用管了,放在頭文件中給其他人使用。
如果想讓類遵守協議也非常簡單,在父類後面加上協議名。協議可以有多個,用逗號分開。
@interface ClassName : ItsSuperclass < protocol list >
@interface Formatter : NSObject < Formatting, Prettifying >
然後按照要求實現方法即可。如果沒有實現完整或不匹配,編譯器會給出警告。
調用方不知道傳過來的委託有沒有實現MyIsOK協議,但可以用 respondsToSelector:來動態檢查(這也是前面提到,沒有協議也能達到同樣效果的原因,ObjC調用某個方法不需要聲明)。對於協議則有更好的檢查方法 conformsToProtocal:
if ( ! [receiver conformsToProtocol:@protocol(MyIsOK)] ) {
// Object does not conform to MyIsOK
}
它可以一次性檢測所有接口,比respondsToSelector:要高效很多。
另一種更常見的手法是使用Type Cheking。
- (void)setDelegate:(id <MyIsOK>)delegate;
id <MyIsOK> delegate;
非正式協議(Informal Protocols)
非正式協議其實是利用類別(Category)的特性聲明方法。
@interface NSObject ( MyIsOK )
- (BOOL)isOK;
@end
這裏之所以用NSObject,是因爲所有對象都繼承於它,比較方便。由於類別並不要求一定實現,所以編譯器的檢查力度較弱,要求調用方自己使用 respondsToSelector 做容錯處理。其實協議已經提供了@optional,就沒有必要使用它了。