Ios 协议必须符合NSObject协议吗?
NSObject协议附带了库存协议模板,但它似乎并不是协议实际实现所必需的。不考虑这一点似乎根本改变不了什么。那么,协议是否真的有必要从中继承,或者它只是一个不必要的附加组件?不一定。委托只是一个助手对象——唯一的要求是委托类对其提出的要求。如果要正式确定给定委托的要求,请创建正式协议,即使用Ios 协议必须符合NSObject协议吗?,ios,objective-c,nsobject,Ios,Objective C,Nsobject,NSObject协议附带了库存协议模板,但它似乎并不是协议实际实现所必需的。不考虑这一点似乎根本改变不了什么。那么,协议是否真的有必要从中继承,或者它只是一个不必要的附加组件?不一定。委托只是一个助手对象——唯一的要求是委托类对其提出的要求。如果要正式确定给定委托的要求,请创建正式协议,即使用@protocol指令声明协议。如果符合NSObject协议是这些要求之一,您可以让您的协议采用它: @protocol MyDelegateProtocol <NSObject> //...
@protocol
指令声明协议。如果符合NSObject协议是这些要求之一,您可以让您的协议采用它:
@protocol MyDelegateProtocol <NSObject>
//...
@end
@协议MyDelegateProtocol
//...
@结束
也就是说,我不认为有任何理由创建一个不是从NSObject或NSProxy派生的委托,而且这两个类都已经符合NSObject协议。不是每个对象都必须子类化
NSObject
,所以我猜如果您希望这样的对象符合您的协议,它不一定必须符合NSObject
符合NSObject让编译器知道对象符合基本要求-检查它。没有说我符合NSObject,编译器怎么知道我符合这些呢
NSObject
定义为
@interface NSObject <NSObject> {
Class isa;
}
typedef struct objc_object {
Class isa;
} *id;
因此,对于id
,编译器不知道它符合NSObject
多年来,我(和许多像我一样的人)没有使我们的协议符合
。它很好用。但这常常令人讨厌。最常见的麻烦是,如果不回溯到NSObject*
(这会破坏协议的整个要点),就无法使用respondsToSelector:
。在ObjC1时代,这并不重要,因为没有@optional
,所以我们都不担心它(在那些日子里,我们根本不怎么使用协议,因为没有@optional
,协议就没有那么有用)。然后,ObjC2伴随着可选方法的精彩添加,突然respondsToSelector:
变得重要起来。我们中的慢一些人花了一点时间,但最终我们开始发现,如果你让你的协议符合
,生活会简单得多。幸运的是,它现在已经进入了Xcode,使每个人都能以更方便的方式做事情
但是不,你不必这么做。在很多情况下这并不重要。但是没有太多理由不这样做,所以我推荐它。推荐,而不是强制要求。 根据苹果的官方文件ProgrammingWithObjective.pdf 如果您试图调用id上的
respondsToSelector:
方法
按照上面定义的协议,您将得到一个编译器
错误是它没有已知的实例方法。一旦你获得资格
带有协议的id,返回所有静态类型检查;你会得到
如果尝试调用中未定义的任何方法,则会出现错误
指定的协议。避免编译器错误的一种方法是设置
采用NSObject协议的自定义协议
上面定义的协议是不符合NSObject
协议的协议
例如,最好的做法是定义协议以符合
到NSObject协议(一些NSObject行为从
将其类接口转换为单独的协议;NSObject类
采用NSObject协议)
如果协议不符合NSObject,则从NSObject派生的委托是否会中断?(换句话说,不一致性通常会导致不调用委托方法吗)?由于NSObject符合NSObject协议,因此从NSObject派生的任何类也符合NSObject协议。因此,不,从NSObject派生的委托不会因为它采用的委托协议没有明确采用NSObject协议而中断。回答得好。。。但是,即使您提到的NSObject协议的烦恼也只会在
IDOBJ
中起作用,因为如果您使用类引用对象,编译器将知道继承。。。大概是从NSObject开始的。。。