繁体   English   中英

协议必须符合 NSObject 协议吗?

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM