<NSObject>協(xié)議
寫在前頭,上一篇我們介紹了NSObject基類中定義的函數(shù)钉稍,但是我們發(fā)現(xiàn)在Cocoa有兩個NSObject涤躲,一個是類,一個是協(xié)議贡未。為什么有兩個种樱?用來做什么?
我們先來看看NSObject協(xié)議中定義了那些方法俊卤,然后再詳細(xì)介紹一下兩者有何不同嫩挤。
<NSObject>協(xié)議方法
- (BOOL)isEqual:(id)object
功能:比較兩個對象的地址是否相等
</br></br>
@property (readonly) NUInterger hash
功能: 聲明獲取hash值得get方法
</br></br>
@property (readonly) Class superclass
功能: 聲明返回父類對象的get方法
</br></br>
- (Class)class
功能: 聲明獲取類本身對象的方法
</br></br>
- (instancetype)self
功能:返回自身實例
</br></br>
- (id)performSelector:(SEL)aSelector
功能: 調(diào)用aSelector方法
</br></br>
- (id)performSelector:(SEL)aSelector withObject:(id)object
功能:調(diào)用aSelector 傳入一個參數(shù)
</br></br>
- (id)performSelector:(SEL)aSelector withObject:(id)object1 withObject:(id)object2
功能: 調(diào)用aSelector 傳入兩個參數(shù)
</br></br>
- (BOOL)isProxy
功能:判斷一個實例是否繼承自NSProxy,如果返回YES就是繼承自NSProxy消恍,反之返回NO
</br></br>
- (BOOL)isKindOfClass:(Class)aClass
功能:判斷對象是否屬于aClass及其子類
</br></br>
- (BOOL)isMemberOfClass:(Class)aClass
功能: 判斷對象是否屬于aClass類
</br></br>
- (BOOL)respondsToSelector:(SEL)aSelector
功能: 判斷對象是否能響應(yīng)aSelector方法
</br></br>
- (BOOL)conformsToProtocol:(Protocol *)aProtocol
功能: 判斷某個對象是否遵守了aProtocol協(xié)議
</br></br>
內(nèi)存管理相關(guān) ARC廢棄 不多說
- (instancetype)retain OBJC_ARC_UNAVAILABLE;
- (oneway void)release OBJC_ARC_UNAVAILABLE;
- (instancetype)autorelease OBJC_ARC_UNAVAILABLE;
- (NSUInteger)retainCount OBJC_ARC_UNAVAILABLE;
- (struct _NSZone*) zone OBJC_ARC_UNAVAILABLE;
@property (readonly, copy) NSString *description
功能: 生成desctiption的get方法
</br></br>
@property (readonly, copy) NSString *debugDescription;
功能: debugDescription的get方法
</br>
那為什么需要一個類岂昭,一個協(xié)議呢
NSObject的類和協(xié)議在Objective-C中存在于不同的命名空間。你可以同時擁有相同的類和協(xié)議狠怨,但是他們在編程語言上是不相關(guān)聯(lián)的约啊。
根類 NSObject
NSObject類屬于根類。在繼承的層級結(jié)構(gòu)中處于最高級佣赖。但是Objective-C中還有其他根類恰矩。比如NSProxy類。NSObject協(xié)議定義了一套所有根類可以實現(xiàn)的基礎(chǔ)方法憎蛤。NSObjec類也是遵循NSObject協(xié)議的枢里,也就是說NSObject類也實現(xiàn)了NSObject協(xié)議所聲明的方法。
@interface NSObject<NSObject>
NSProxy同樣也遵循NSObjec協(xié)議
@interface NSProxy<NSObject>
在這里我們介紹一下NSProxy類,順便說一下NSObject協(xié)議
</br>
為什么有NSProxy類呢栏豺,顧名思義彬碱,NSProxy類作為是一個代理類的根類。很多情況下你持有一個類奥洼,但是可以不實現(xiàn)你不需要的方法(如果有需要你完全可以實現(xiàn)所有聲明的方法)巷疼,這個時候NSProxy類就派上用場了,NSProxy,它是個抽象的超類灵奖,它實現(xiàn)了一些消息轉(zhuǎn)發(fā)的方法嚼沿,可以繼承它實現(xiàn)一些類的替身類或者是虛擬出一個不存在的類。瓷患。當(dāng)然你如果使用繼承自NSObject類的對象也可以實現(xiàn)骡尽,但是有可能會引入更多的包,容易導(dǎo)致沖突擅编。而NSProxy通過提供了一個不含多余內(nèi)容的簡潔超類來避免此種情況的發(fā)生攀细。
根協(xié)議 NSObject
實際上我們很少用到其他的根類,所以NSObject協(xié)議也很少在編程中出現(xiàn)爱态,用到最多的地方就是在你自定義的協(xié)議中谭贪。
比如,假如我們自己定義個協(xié)議MyProtocol:
@protocol MyProtocol
- (void)foo;
@end
有一個類Obj遵循了你這個協(xié)議:
@interface Obj:NSObject<MyProtocol>
@end
你可以這樣調(diào)用- (void)foo:
Obj *obj锦担;
[obj foo];
但是不能調(diào)用 description 和 isEqual 這些在NSObject協(xié)議中聲明的方法:
[obj description];
[obj isEqual: obj2];
因為你的協(xié)議中只聲明了 - (void)foo這一個方法俭识。怎么辦呢,協(xié)議是可以繼承的洞渔,所以在定義協(xié)議的時候套媚,我們自己定義的協(xié)議需要繼承自根協(xié)議NSObject。
@protocol MyProtocol<NSObject>
- (void)foo;
@end
這樣對象不僅遵從了MyProtocol磁椒,而且也同時遵從了NSObject協(xié)議堤瘤,可以響應(yīng)這兩個協(xié)議中的消息。正因為你應(yīng)用中所有的對象都繼承于NSObject類并且遵循NSObject協(xié)議衷快,這樣在實現(xiàn)MyProtocol的實例時不需要更多條件就可以使用NSObject的一般方法宙橱。
</br>
我的理解:NSObject協(xié)議定義了一些標(biāo)準(zhǔn)的接口,而NSProxy類或者其他根類遵循這個協(xié)議蘸拔,這樣就形成了一個相對統(tǒng)一的接口實現(xiàn)师郑,在發(fā)送消息調(diào)用的時候比較方便。對于NSObject根類來說调窍,它遵循了NSObject協(xié)議宝冕,所有繼承于它的類都實現(xiàn)了NSObject協(xié)議中的方法,這樣在之后的使用中可以就可以調(diào)用NSObject的一般方法邓萨。