OC 30 day
作用:專門用來聲明一大堆方法。(不能聲明屬性,也不能實現方法,只能用來寫方法的聲明)。只要某個類遵守了這個portocol。就相當於擁有這個portocol中的所有的方法聲明。
如上圖,只要某個類遵守了這個portocol,就相當於擁有了這個portocol的所以方法聲明,而不用自己去定義。
@protocol portocol名稱 <NSObject>
methods聲明
@end
新增一個portocol的方式。NewFile OC-File-protoco portocol的文件名: .h 並且只有一個 .h 文件。
在portocol的文件中,只能用來聲明方法,portocol的作用:就是專門用來寫方法聲明的。
portocol是用寫方法聲明的,就是用來被類遵守的。
如果想要讓一個類,擁有portocol中定義的所有的方法聲明,那麼就讓這個類遵守這個portocol。
類只要遵守一個portocol,那麼這個類就擁有了這些portocol中定義的所以的方法的聲明了。
這個類只是擁有了這個portocol中的方法聲明爾以。沒有實現。所以這個類,就應該匙實現portocol中的方法。
一個類只能有一個父類
但是一個類可以同時遵守多個portocol。
@interface 類名:父類名 <protocol1,portocol2>
@end
當一個類遵守了多個portocol之後,就相當於這個類擁有了所有portocol中定義的方法聲明。那麼這個類,就應該實現所有portocol中的方法。
如果不實現,其實也不會報錯,編譯器只是會報警告。
但是當創建對象,來調用這個沒有實現的portocol中的方法的時候,就會報錯。
當一個類遵守了多個portocol之後,就相當於這個類擁有了所有portocol中定義的方法聲明。但是僅僅只是有方法的聲明而已,沒有實現,要類自己去實現。
如果不實現,其實也不會報錯,編譯器只是會報警告。
但是當創建對象,來調用這個沒有實現的portocol中的方法的時候,就會報錯。
這兩個修飾符是專門用來修飾portocol的方法。
在portocol中,如果方法的聲明被@required修飾,那麼遵守這個portocol的類必須要實現這個方法,否則編譯器會發出警告。
在portocol中,如果方法的聲明被@optional修飾,那麼遵守這個portocol的類可以實現這個方法,也可以不實現這個方法,不實現編譯器也不會發出警告。
其實,無論是@required還是@optional你都可以不實現。編譯器是不會報錯的,仍然可以編譯執行。唯一的區別是:當遵守portocol的類不實現portocol中的方法時,@required會給一個警告,@optional沒有。
這兩個關鍵字的主要作用在於:工程師的溝通,告訴遵守portocol的類,哪些方法必須要實現,因為這些方法我會調用。
默認的狀態為 @required
繼承的語法:
@portocol 名稱 <父portocol>
@end
效果:子portocol不但有自己的方法聲明,還有父portocol中的所有方法聲明。
在Foundation框架中,有一個類叫做NSObject是所有OC類的基類。
在Foundation框架中,有一個Portocol,叫做NSObject
NSObject portocol 都被 NSObject 類遵守,所以NSObject portocol中的所有方法全部的OC類都有了,這麼說。所有的OC類都遵守了NSObject portocol。NSObject portocol叫做基協議
類的名稱可以跟portocol的名稱一致。
要求所有的portocol都必須要直接或是間接的從NSObject基協議繼承。