Cocoa root class
问题来源:
常见面试问题之:
NSObject和NSObject protocol有什么区别,为什么要有NSObject protocol, 有没有不继承自NSObject的类?
虽然在iOS开发过程中所用到的几乎所有的类都派生自NSObject, 但Cocoa并不是只有一个NSObject这一个root class. 另一个典型的root class就是NSProxy. 这也就是为什么同时需要定义NSObject类和NSObject协议. 那些不是从NSObject派生的类,也可以实现NSObject protocol的. 也就是说,NSObject class和NSObject protocol本身是相互独立的,按照正常的对类的理解和对协议的理解去理解这个事情就可以了。当然,NSObject protocol协议存在的必要性就是因为不是所有的类都派生自NSObject.
在NSProtocol的定义中有如下的方法:
- (BOOL)isProxy;
这个方法就可以用来判断这个类是否是从其他的根类派生.
文档描述如下:
- (BOOL)isProxy |
|
Description |
Returns a Boolean value that indicates whether the receiver does not descend from NSObject. (required) |
|
This method is necessary because sending isKindOfClass: or isMemberOfClass: to an NSProxy object will test the object the proxy stands in for, not the proxy itself. Use this method to test if the receiver is a proxy (or a member of some other root class). |
Returns |
NO if the receiver really descends from NSObject, otherwise YES. |
至于NSProxy本身,一般iOS开发中会比较少用。NSProxy可以用来实现代理模式和模拟多继承;具体的可以参见如下的博文:
使用NSProxy实现代理模式 : http://blog.csdn.net/onlyou930/article/details/7548476
使用NSProxy实现消息转发机制,模拟多重继承: http://blog.csdn.net/onlyou930/article/details/7548634
另有如下文章详细的描述NSObject class与NSObject protocol的,我比较懒,就直接贴链接了:
原文:NSObject: the Class and the Protocol https://mikeash.com/pyblog/friday-qa-2013-10-25-nsobject-the-class-and-the-protocol.html
译文:http://my.oschina.net/yongbin45/blog/202535