Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/sorting/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 协议必须符合NSObject协议吗?_Ios_Objective C_Nsobject - Fatal编程技术网

Ios 协议必须符合NSObject协议吗?

Ios 协议必须符合NSObject协议吗?,ios,objective-c,nsobject,Ios,Objective C,Nsobject,NSObject协议附带了库存协议模板,但它似乎并不是协议实际实现所必需的。不考虑这一点似乎根本改变不了什么。那么,协议是否真的有必要从中继承,或者它只是一个不必要的附加组件?不一定。委托只是一个助手对象——唯一的要求是委托类对其提出的要求。如果要正式确定给定委托的要求,请创建正式协议,即使用@protocol指令声明协议。如果符合NSObject协议是这些要求之一,您可以让您的协议采用它: @protocol MyDelegateProtocol <NSObject> //...

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开始的。。。