id<protocol>和NSObject<protocol>之间的区别

9
在Objective-C中,id<protocol>NSObject<protocol>经常用于委托声明。
id和NSObject之间的主要区别是什么? 何时使用其中之一而不是另一个?

有用的 https://dev59.com/a3RB5IYBdhLWcg3w6bcE - Maulik
2
这不是重复的问题,因为“id vs NSObject *”和“id<protocol> vs NSObject<protocol> *”是完全不同的问题。请投票重新开放。 - Martin R
马丁是正确的,这不是一样的。 - Boon
1个回答

10

id<protocol> obj是符合指定协议的任何对象的声明。 您可以向该对象发送来自给定协议(或从继承自<protocol>的协议)的任何消息。

NSObject<protocol> * obj是符合给定协议且派生自NSObject的任何对象的声明。

  • 这意味着在第二种情况下,您可以向该对象发送来自NSObject类的任何方法,例如
id y = [obj copy];

在第一种情况下,这将导致编译错误。

第二个声明还意味着 obj 符合 NSObject 协议。 但如果 <protocol> 派生自 NSObject 协议,则没有任何区别:

@protocol protocol <NSObject>

谢谢Martin。如果protocol是从<NSObject>派生的,那么id<protocol>在功能上与NSObject<protocol>相同吗? - Boon
@Boon:不是的。"这没有任何区别"只适用于答案的最后一部分,即id<protocol> objNSObject<protocol> *obj都意味着对象符合NSObject协议。也许我应该从答案中删除最后一部分,这只会让它更加混乱。 - Martin R

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接