iphone - protocol继承 - protocolkit




为什么要将NSObject的协议添加到协议实现中 (4)

如果您使用任何NSObject协议方法(如retain,release,class,classname),除非您的协议还包含NSObject协议,否则编译器会向您发出警告。

我一直在看到一些代码类似于以下内容:

@protocol MyProtocol <NSObject>
// write some methods.
@end

MyProtocol符合NSObject协议有什么特别的原因吗? 如果你做的事情如下:

id <MyProtocol> foo; // foo here conforms to NSObject AND MyProtocol?

只是好奇逻辑是什么。


当你声明一个变量时

 id<MyProtocol> var;

Objective-C编译器只知道MyProtocol的方法,因此如果您尝试在该实例上调用任何NSObject方法(例如-retain/-release ,则会产生警告。 因此,Cocoa定义了一个镜像NSObject类和实例方法的NSObject协议。 通过声明MyProtocol实现NSObject协议,您可以向编译器提供一个提示,即所有NSObject方法都将由实现MyProtocol的实例实现。

为什么这一切都是必要的? Objective-C允许对象从任何根类下降。 在Cocoa中,NSObject是最常见的,但不是唯一的根类。 例如, NSProxy也是一个根类。 因此, id类型的实例不一定继承NSObject的方法。


我在代码中从未这样做,但我可以看到它的优点。 如果您将参数作为id <SomeProtocol>传递,则需要重新id <SomeProtocol>它,如果您想在该对象上调用任何NSObject的方法。


我很确定你这样做的原因是将NSObject成员(比如retain和release)添加到你的协议中。 从技术上讲,你仍然可以发送这些消息,但没有它你会收到编译器警告。