interface是一個類的頭文件的聲明不是真正意義上的接口的意思。protocol纔是OC的接口。java
做用:程序員
用來聲明一些方法 也就是說,一個prtocol是由一系列方法聲明組成的。
語法格式:web
@protocol 協議名 //方法的聲明列表 @end
@interface 類名 : 父類 <協議名稱1, 協議名稱2,…> @end
Protocol和繼承的區別:安全
協議的注意事項:ide
一、協議只能聲明方法,不能聲明屬性。 二、父類遵照了某個協議,那麼子類也會自動遵照協議。 三、OC中能夠遵循多個協議,可是隻能有一個父類。OC不能多繼承,可是能夠多層繼承。 四、協議也能夠遵照其餘協議,而後有一個類遵照這個協議的話,就會具有全部協議的方法聲明。 五、每一個新的協議都遵照NSObject的協議(建議都遵循,不遵循也不要緊)
protocol能夠實現一些必須實現和選擇實現的方法。這個和java是徹底不一樣的。ui
@required和@optional關鍵字url
@protocol SportProtocol <NSObject> @required // 若是遵照協議的類不實現會報警告 - (void)playFootball; @optional // 若是遵照協議的類不實現不會報警告 - (void)playBasketball; @end
注意:@required和@optional僅僅使用程序員之間交流, 並不能嚴格的控制某一個遵照該協議的類必 需要實現該方法, 由於即使不是實現也不會報錯, 只會報一個警告
協議的類型限制spa
三、雖然在接受一個對象的時候,對這個對象進行了類型限定(限定它必須實現某個協議),但並不意味着這個對象就真正的實現了該方法,因此每次在調用對象的協議方式應該進行一次驗證。3d
wife這個類遵循了一個協議,並實現了須要的方法,而後在Person類中有一個wife對象屬性,並在Person本身的方法中調用wife的屬性[self.wife cooking],這裏就須要驗證wife的方法是否實現了協議的方法。(看下面的代碼)代理
這麼作也是用於程序員之間溝通的。這樣可使得第二個個程序員和第一個程序員開發的代碼在協議上很好的發現須要遵循協議並須要實現的地方。
四、遵照協議,僅僅是具備協議中方法的聲明,可是沒有方法的實現,全部還須要具體的實現。
驗證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真正的導入一個協議的聲明