必须协议符合NSObject协议吗?

Cod*_*aFi 19 objective-c nsobject ios

NSObject协议附带了库存协议模板,但它似乎并不是实际协议实现所必需的.离开它似乎完全没有改变.那么,协议是否真的有必要从中继承,还是仅仅是一个不必要的附加组件?

Rob*_*ier 20

多年来我(和许多像我一样)没有让我们的协议符合<NSObject>.它工作正常.但它往往很烦人.最常见的烦恼是你不能在没有respondsToSelector:反击的情况下使用NSObject*(哪种方式违背了协议的全部要点).这在ObjC1时代并不重要,因为没有@optional,所以我们都没有人担心它(在那些日子里我们根本没有使用协议,因为没有@optional它们没那么有用).然后ObjC2带来了可选方法的精彩添加,突然变得respondsToSelector:很重要.我们花了一些时间来讨论我们的慢,但最终我们开始发现,如果你的协议符合要求,生活就会简单得多<NSObject>.幸运的是,这已经进入Xcode,让每个人都能更方便地做事.

但不,你不必这样做.在许多情况下并不重要.但没有太多理由不去做,所以我推荐它.


Cal*_*leb 7

不必要.委托只是一个帮助对象 - 唯一的要求是委托类放在它上面的那些要求.如果要形式化给定委托的要求,请创建正式协议,即使用该@protocol指令声明协议.如果符合NSObject协议是其中一项要求,您可以使您的协议采用它:

@protocol MyDelegateProtocol <NSObject>
//...
@end
Run Code Online (Sandbox Code Playgroud)

也就是说,我没有看到任何理由创建一个不是从NSObject或NSProxy派生的委托,并且这两个类已经符合NSObject协议.

  • 由于NSObject符合NSObject协议,因此从NSObject派生的任何类也符合NSObject协议.所以不,从NSObject派生的委托不会因为它采用的委托协议没有明确采用NSObject协议而中断. (2认同)