標籤:void 擷取 選擇 prot blank ios7 也會 run 影響
最近工作中遇到一個比較迷惑的事情,在我利用runtime擷取類的屬性的時候,由於類實現了一個自訂協議,導致遍曆出來的屬性中包含了NSObject協議中的property。查來查去,只是知道和protocol有關。晚上問了下朋友(iOS大神),結果被他一句點破。發現這部分知識點遺漏了一點。
protocol類似java中的interface,主要是用來定義一套對象之間的通訊規則。protocol也是我們設計時常用的一個東西,相對於直接繼承的方式,protocol則偏向於組合模式。因為在設計對象的時候,如果基類東西很多,而不同的子類又不一定都需要基類的東西,或者在絕大部分需要的同時,又有特殊的要求,那這個時候就很混亂了。採用介面,可以將不同的功能歸類為不同的介面,這樣,子類需要什麼功能,自己去實現這個介面,這樣在保持繼承性的同時,可以對功能進行擴充,而不影響其他類,也讓子類保持自己的特有性。
protocol文法:
@protocol protocolName//method//property@end
和類的聲明很相似,不僅可以聲明方法,同樣也可以聲明property。如果某個類需要實現某個介面,則只需要在類的申明後面加上<>,在裡面寫上要實現的協議名字,多個協議以逗號隔開。
@interface Test : NSObject <delegate1, delegate2>@end
protocol關鍵字:required,optional
@protocol TestProtocol@required- (void)requiredMethod;@optional- (void)optionalMethod;@end
protocol預設都是required的,一個類在實現協議的時候是必須要實現這些方法的。相對的,如果optional下面的方法,則表示類可以選擇性的實現。判斷這個類是否實現某個方法則只需調用[self.delegate respondToSelector:@selector()]
protocol的繼承
protocol和類一樣,同樣可以進行繼承,這個也是我遺漏的一點。
@protocol Test1Delegate@end@protocol Test2Delegate <Test1Delegate>@end;
這個時候,如果類實現了Test2Delegate這個協議,那麼也必須實現Test1Delegate裡面的方法。 我們自己寫的protocol的時候,一般Xcode都預設幫我們繼承了NSObject這個協議。如果你不繼承的話也沒啥大的影響,因為我們的對象都是繼承自NSObject,而NSObject也實現了NSObject這個協議。所以,當我們需要調用NSObject協議裡面的方法的時候,也不會出錯。不過蘋果還是推薦繼承NSObject這個協議。
protocol隱藏類的類型
在我們iOS開發中也會出現這種形式,比如iOS7的導覽列動畫,蘋果只是需要你返回一個實現了UIViewControllerAnimatedTransitioning這個協議的對象就行了。
還有一個可能在和第三方sdk打交道的時候見得比較多。在別人實現的架構裡面,有的時候,不希望把類的類型和裡面方法暴露給你,而你也不太可能直接建立這個對象。這個時候就可以採用protocol這個方式,讓調用者無需知道類的類型,一樣可以完成自己想要的操作。
id <Test1Delegate>obj = [XXXX createObj];
調用者只需要通過[XXXX createObj]這個方法,擷取一個實現Test1Delegate而不知道類型的執行個體。在需要的地方,這個obj可以直接調用協議裡面的方法,因為,這個對象都已經實現了。
protocol 差不多就這麼多內容,比較簡單。
[HMLY]12.iOS中的Protocol