[英]Must Protocols Conform To The NSObject Protocol?
NSObject 协议带有常用的协议模板,但它似乎并不是协议实际实现所必需的。 将其排除在外似乎完全没有任何改变。 那么,一个协议真的有必要继承它,还是只是一个不必要的附加组件?
多年来我(和很多像我一样的人)没有让我们的协议符合<NSObject>
。 它工作正常。 但这通常很烦人。 最常见的烦恼是您不能使用respondsToSelector:
而不转换回NSObject*
(这破坏了协议的全部意义)。 这在 ObjC1 时代并不重要,因为没有@optional
,所以我们都不担心它(那时候我们根本没有使用协议,因为没有@optional
它们就没那么有用了)。 然后 ObjC2 随着可选方法的精彩添加而出现,突然respondsToSelector:
mattered。 对于我们速度较慢的人来说,这花了一些时间,但最终我们开始发现,如果你让你的协议符合<NSObject>
,生活会简单得多。 幸运的是,现在已经进入Xcode,让每个人都可以更轻松、更方便地做事。
但是不,你不必这样做。 在很多情况下这并不重要。 但没有太多理由不这样做,所以我推荐它。
不必要。 委托只是一个助手 object——唯一的要求是委托 class 对它提出的要求。 如果你想形式化给定委托的要求,创建一个正式的协议,即使用@protocol
指令声明一个协议。 如果符合 NSObject 协议是这些要求之一,您可以让您的协议采用它:
@protocol MyDelegateProtocol <NSObject>
//...
@end
也就是说,我看不出有任何理由创建一个不是从 NSObject 或 NSProxy 派生的委托,并且这两个类都已经符合 NSObject 协议。
并非每个 object 都必须子类化NSObject
,所以我想如果您期望这样的 object 符合您的协议,它不一定必须符合 NSObject。
符合 NSObject 让编译器知道 object 符合基础知识 - 查看NSObject Protocol Reference 。 不用说我符合 NSObject 编译器怎么知道我符合这些?
NSObject
定义为
@interface NSObject <NSObject> {
Class isa;
}
而id
被定义为
typedef struct objc_object {
Class isa;
} *id;
所以对于id
编译器不知道它符合NSObject
推荐而非强制。
根据苹果官方文档ProgrammingWithObjectiveC.pdf
如果您尝试在符合上面定义的协议的 id 上调用
respondsToSelector:
方法,您将收到一个编译器错误,指出没有已知的实例方法。 一旦你用协议限定了一个 id,allstatic 类型检查就会回来; 如果您尝试调用任何未在指定协议中定义的方法,您将收到错误消息。 避免编译器错误的一种方法是将自定义协议设置为采用 NSObject 协议。
上面定义的协议是一个不符合NSObject
协议的协议。
例如,最好的做法是定义您的协议以符合 NSObject 协议(NSObject 的某些行为从其 class 接口拆分为单独的协议;NSObject class 采用 NSObject 协议)。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.