協定
兩個事物之間達成某些約定,協定規定了遵守協定的事物
【協定作用】
協定就是來規範接口
代碼中的協定【隻有OC有】
OC @protocal
其他語言類似的協定(隻是類似)
JAVA 接口
C++ 抽象類
OC協定
規定了遵從協定的類,需要實作的方法
這個類遵守協定之後,這個類的執行個體對象也就遵守了協定
類似通過尖括号遵從協定,就必須實作要求的方法
【協定目的】實作通信
自定義IOSCode協定
自定義的協定,都要遵守NSObject協定
【一旦導入了協定的頭檔案,就代表目前類遵守協定】
import “IOSCode.h”
@protocal IOSCode <NSObject>
聲明方法
-(void)writeIOSCode;
@required//必須要實作的【遵守協定的類必須要實作這個方法】【此屬性可不寫】
-(void) reading;
@optional//可選的【遵守協定的類可以實作這個方法,也可以不實作】
-(void)eat;
@end
NSObject基協定
協定的内容就是方法【協定直接寫在.h檔案中】
協定中不能寫成員變量
協定中可以寫多個方法
一旦遵守IOSCode協定,那麼遵守協定的類必須要實作這個方法
協定中的方法,在類的.h檔案中可以不聲明
一旦遵守協定,那麼協定中的方法必須要實作
【協定作用】規範方法/接口
類遵守了協定,那麼這個類的執行個體對象也就遵守了
多了一個指針指向對象,計數器要➕1
id <IOSCode> staff = [xiaohuang retain];
staff : xiaohuang角色的轉變
id【泛型指針】
staff還是一個泛型對象指針,這個指針遵守IOSCode協定
staff指針指向的對象也必須要遵守IOSCode協定,否則會報警
staff指針隻能調用協定中的方法,否則會報警【看對象不看指針,是以仍然會執行對象的方法】—>ARC環境下直接報錯
[staff writeIOSCode];
指針必須要指向遵守協定的類的對象
檢測staff指向的對象是否遵守IOSCode協定
objective-c的和C++裡的(void*)類似
PS:Objective-C和Java一樣,都有運作時環境,有内省的能力。Objective-C和java有很多不同的地方,在iOS系統裡,Objective-C的記憶體需要自己管理,添加了ARC機制後編譯器幫助了Objective-C 添加release釋放的代碼。而Java是通過垃圾回收器管理記憶體的。
if([staff conformsToProtocal:@protocal(IOSCode)])
{
執行方法
}
通過選擇器檢測判斷類中可選方法定義是否存在【方法在協定中是可選方法,但是沒有定義】
if([staff respondsToSelector:@selector(drink)])
{
執行方法
}
派生時調用不同方法
for (id obj in arrar)
{
//會把同一個消息給不同的對象
//這些消息都會被相應,如果消息存在,那麼沒問題
//但是如果該消息不存在,程式就會爆炸
//【Want】不同的對象想要相應不同的消息
//【idea】判斷該對象是哪一個類的對象
[obj eat];
//if ([obj isKindOfClass:[Qu class]])-->這樣寫也可以
if (YES==[obj isKindOfClass:[Qu class]]) {
[obj haha];
}
else if (YES==[obj isKindOfClass:[Bug class]])
{
[obj beatOthers];
}
}
遵守NSObject協定,普通類繼承于NSObject類,就擁有了NSObject中的所有方法,遵守NSObject協定
【結論】:普通類不需要遵守NSObject協定中的方法