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
Objective c 为什么respondsToSelector:存在?_Objective C_Crash_Selector_Performselector - Fatal编程技术网

Objective c 为什么respondsToSelector:存在?

Objective c 为什么respondsToSelector:存在?,objective-c,crash,selector,performselector,Objective C,Crash,Selector,Performselector,为什么每次尝试向可能不响应消息/选择器的对象发送消息时,都必须手动检查此项?为什么语言不能在每次发送消息时,或者每次调用performSelector:或此消息的变体时为我们执行检查。这将消除由于发送无效消息而导致的所有崩溃 这样做效率太低了吗?为什么每个方法调用都没有内置检查,有几个很好的原因。首先,这将是相当低效的。但更重要的是,在大多数情况下,您应该只调用已知的方法,因此不需要进行检查 但我们确实希望在运行时进行检查的原因有很多。带有可选方法的协议是一种主要情况。使用不同版本的API是另一

为什么每次尝试向可能不响应消息/选择器的对象发送消息时,都必须手动检查此项?为什么语言不能在每次发送消息时,或者每次调用performSelector:或此消息的变体时为我们执行检查。这将消除由于发送无效消息而导致的所有崩溃


这样做效率太低了吗?

为什么每个方法调用都没有内置检查,有几个很好的原因。首先,这将是相当低效的。但更重要的是,在大多数情况下,您应该只调用已知的方法,因此不需要进行检查

但我们确实希望在运行时进行检查的原因有很多。带有可选方法的协议是一种主要情况。使用不同版本的API是另一个常见原因。随着时间的推移,会添加或删除新方法


我们需要能够区分错误和我们调用的方法可能存在也可能不存在之间的区别。当它是一个错误,我们希望失败和例外。当一个方法是可选的时,我们需要进行运行时检查,以便在调用不存在时跳过调用。

密切相关,可能包含您的答案:假设您调用了一个类不存在的方法(因为它不符合协议),那么您的代码将崩溃。所以我们需要检查该类是否响应方法/选择器。@AnoopVaidya:我想很明显,Popcorn知道这一点,但想知道为什么会做出这个决定。谢谢Josh,是的,我想知道苹果为什么会做出这个设计决定,基于这一联系,似乎没有一个令人满意的答案。罗布·马约夫的答案的结尾似乎很好地回答了这个问题/me Shugsall是真的,还有一个更为深奥的原因是对象除了在发送消息时运行方法之外还有其他选择--。这种可能性使得编译时
响应选择器:
的检查毫无意义,而调度时检查的意义则稍小一些。