天天看點

OC協定和id協定OC協定NSObject基協定id【泛型指針】

協定

兩個事物之間達成某些約定,協定規定了遵守協定的事物

【協定作用】

協定就是來規範接口

代碼中的協定【隻有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協定中的方法