【问题标题】:Difference between id<protocol> and NSObject<protocol>id<protocol> 和 NSObject<protocol> 的区别
【发布时间】:2013-12-13 13:08:13
【问题描述】:

在 Objective-C 中,id&lt;protocol&gt; or NSObject&lt;protocol&gt; 经常用于委托声明。

id 和 NSObject 的主要区别是什么? 您想在什么时候使用一个与另一个?

【问题讨论】:

  • 这不是重复的,因为“id vs NSObject *”和“id&lt;protocol&gt; vs NSObject&lt;protocol&gt; *"”是截然不同的问题。投票重新开放。
  • 马丁说得对,不一样。

标签: objective-c delegates


【解决方案1】:

id&lt;protocol&gt; obj 是任何符合指定协议的对象的声明。 您可以将任何消息从给定协议发送到对象(或从协议 &lt;protocol&gt; 继承自)。

NSObject&lt;protocol&gt; *obj 是任何对象的声明

  • 符合给定的协议,并且
  • 派生自NSObject

这意味着在第二种情况下,您可以发送来自NSObject 类的任何方法 到对象,例如

id y = [obj copy];

在第一种情况下会导致编译器错误。

第二个声明还暗示obj 符合NSObject 协议。 但是如果&lt;protocol&gt; 是从 NSObject 协议派生的,这没有什么区别:

@protocol protocol <NSObject>

【讨论】:

  • 谢谢马丁。所以如果协议是从 派生的,那么 id 在功能上与 NSObject 相同?
  • @Boon: 否。“这没什么区别” 仅适用于答案的最后一部分,id&lt;protocol&gt; objNSObject&lt;protocol&gt; *obj 都暗示对象符合到 NSObject 协议。 - 也许我应该从答案中删除最后一部分,这只会更加混乱。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多