下面的代码是绝对安全的,但是 Xcode 4 给我一个错误:
if ([self respondsToSelector: @selector(foo)])
[self foo];
我知道我可以使用虚拟协议(protocol)来绕过它,但我经常使用这种模式,而且我觉得应该不需要那么多的工作。有什么办法可以在某处设置一个设置,最好是设置一次,这样这个“错误”就不会再困扰我了吗?
最佳答案
if ([self respondsToSelector: @selector(foo)])
[self foo];
如果没有参数也没有返回值,则该表达式仅“完全安全”。如果需要任何类型信息,@selector(foo)
是不够的。
即便如此,我怀疑有些架构的 ABI 是这样的,即无参数无返回情况实际上需要类型知识可供编译器使用,以便能够生成绝对保证正确的代码。
也就是说,您的 fooWithInteger:
和/或 fooWithX:y:z:
示例可能不可能在没有由于 C 语言和特定于体系结构的 ABI 的变幻莫测,可用的完整类型信息。
同样,要允许编译器在没有警告的情况下进行编译,需要编译器勾结一个运行时表达式——respondsToSelector:
必须被动态调度——与编译时表达式。编译器讨厌那样。
关于iphone - Xcode 4/LLVM 3.0——让它更智能地处理 "no known instance method for selector"错误?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6920933/