Objective-C協議淺析與使用

作者: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,就沒有必要使用它了。

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