NSObject 为啥要遵循 NSObject 协议呢 ?
2020-06-22 本文已影响0人
天空中的球
NSObejct小伙伴无意间发出的一个疑惑,NSObject 为啥要遵循 NSObject 协议呢 ?
首先看看协议中有哪些, 都是我们常见的方法:
- (BOOL)isProxy;
- (BOOL)isKindOfClass:(Class)aClass;
- (BOOL)isMemberOfClass:(Class)aClass;
- (BOOL)conformsToProtocol:(Protocol *)aProtocol;
- (BOOL)respondsToSelector:(SEL)aSelector;
经过查找发现:
- 在Objective-C 2.0之前, Protocol 的这个 @optional 选项是不存在的,所有的 Protocol 方法都是必须实现的。所以不遵循 <NSObject> 也没关系,只要判断指针是否存在然后直接调用就完了。
- 在Objective-C 2.0之后,加了@optional 特性,于是乎必须使用 的 respondsToSelector: 方法先做一次判断了。
延伸:
NSProxyNSProxy 也是遵循 <NSObject> 协议的
理解:
-
一个对象要调用另一个对象的方法,不是采取直接调用的方式,而是通过调用某个实现了特定接口/协议或者继承了某个抽象类的对象这种方式来进行解耦。
-
NSProxy为什么不继承NSObject?
- 简单说就是不需要实现那么多杂七杂八的东西,多了反而可能引起冲突。
- 建立 NSProxy 对象的目是为了预留大多数未实现的方法,使用forwardInvocation:方法来转发。
- 而NSProxy是遵循了NSObject协议的,里面声明了一套所有的根类都可以实现的基础方法。
综上原因和相关:
- 1、为了兼容 Objective-C 2.0 的新增的特性,来保证我们调用的安全性。
- 2、NSObject的类和协议在Objective-C中存在于不同的命名空间。我们可以同时拥有相同的类和协议,但是他们在编程语言上是不相关联的, 所以没有关系。
- 3、无形中也是在解耦的。
总结: 一个 NSObject 协议允许多个根类拥有相同的基础方法,所以我们能很方便的声明一个包含了相同基础功能的协议 。
而 NSObject 类遵循了 NSObject 协议,就可以把所有的东西融合到一起啦。
笔记来源: