我一直在看到一些类似于以下内容的代码:
@protocol MyProtocol// write some methods. @end
MyProtocol符合NSObject协议有什么特别的原因吗?如果你做的事情如下:
idfoo; // foo here conforms to NSObject AND MyProtocol?
只是好奇逻辑是什么.
当你声明一个变量时
idvar;
Objective-C编译器只知道其中的方法,MyProtocol
因此如果您尝试调用该实例上的任何NSObject
方法,则会产生警告-retain/-release
.因此,Cocoa定义了一个NSObject
镜像NSObject
类和实例方法的协议.通过声明MyProtocol
实现NSObject
协议,您可以为编译器提供一个提示,即所有NSObject
方法都将由实现的实例实现MyProtocol
.
为什么这一切都是必要的?Objective-C允许对象从任何根类下降.在Cocoa中,NSObject是最常见的,但不是唯一的根类.NSProxy
例如,也是一个根类.因此类型的实例id
并不一定继承NSObject
的方法.
我很确定你这样做的原因是将NSObject成员(比如retain和release)添加到你的协议中.从技术上讲,你仍然可以发送这些消息,但没有它你会收到编译器警告.
当你拥有具有@optional
方法的协议时(例如"现代"Objective-C 2.0委托经常使用这种技术),它也非常方便.如果你不包含NSObject
协议,当你试图调用respondsToSelector:
该对象时,你会收到警告.