標籤:
Protocol
interface是一個類的標頭檔的聲明不是真正意義上的介面的意思。protocol才是OC的介面。
作用:
用來聲明一些方法也就是說,一個prtocol是由一系列方法聲明組成的。
文法格式:
@protocol 協議名 //方法的聲明列表@end
- 類遵守協議
- 一個類可以遵守1個或多個協議
- 任何類只要遵守了Protocol,就相當於擁有了Protocol的所有方法聲明
@interface 類名 : 父類 <協議名稱1, 協議名稱2,…>@end
Protocol和繼承的區別:
- 繼承之後預設就有實現, 而protocol只有聲明沒有實現
- 相同類型的類可以使用繼承, 但是不同類型的類只能使用protocol
- protocol可以用於儲存方法的聲明, 可以將多個類中共同的方法抽取出來, 以後讓這些類遵守協議即可
協議的注意事項:
1、協議只能聲明方法,不能聲明屬性。2、父類遵守了某個協議,那麼子類也會自動遵守協議。3、OC中可以遵循多個協議,但是只能有一個父類。OC不能多繼承,但是可以多層繼承。4、協議也可以遵守其他協議,然後有一個類遵守這個協議的話,就會具備所有協議的方法聲明。5、每個新的協議都遵守NSObject的協議(建議都遵循,不遵循也沒關係)
protocol可以實現一些必須實現和選擇實現的方法。這個和java是完全不同的。
@required和@optional關鍵字
- 協議中有2個關鍵字可以控制方法是否要實現(預設是@required,在大多數情況下,用途在於程式員之間的交流)
- @required:這個方法必須要實現(若不實現,編譯器會發出警告)
- @optional:這個方法不一定要實現
@protocol SportProtocol <NSObject>@required // 如果遵守協議的類不實現會警示告- (void)playFootball;@optional // 如果遵守協議的類不實現不會警示告- (void)playBasketball;@end
注意:@required和@optional僅僅使用程式員之間交流, 並不能嚴格的控制某一個遵守該協議的類必 須要實現該方法, 因為即便不是實現也不會報錯, 只會報一個警告
驗證wife的方法是否實現了協議的方法。if([self.wife respondsToSelector:@selector:(cooking)]){ [self.wife cooking];}if([self.wife respondsToSelector:@selector:(washing)]){ [self.wife washing];}if([self.wife respondsToSelector:@selector:(job)]){ [self.wife job];}
協議的編寫規範: 1.一般情況下, 當前協議屬於誰, 我們就將協議定義到誰的標頭檔中 2.協議的名稱一般以它屬於的那個類的類名開頭, 後面跟上protocol或者delegate 3.協議中的方法名稱一般以協議的名稱protocol之前的作為開頭 4.一般情況下協議中的方法會將觸發該協議的對象傳遞出去
5.一般情況下一個類中的代理屬於的名稱叫做 delegate
6.當某一個類要成為另外一個類的代理的時候, 一般情況下在.h中用@protocol 協議名稱;告訴當前類 這是一個協議. 在.m中用#import真正的匯入一個協議的聲明
Objective-C之Protocol