Iphone Xcode 4/LLVM 3.0——使“;选择器“的实例方法未知”;错误?
以下代码非常安全,但Xcode 4给了我一个错误:Iphone Xcode 4/LLVM 3.0——使“;选择器“的实例方法未知”;错误?,iphone,objective-c,ios,xcode,llvm,Iphone,Objective C,Ios,Xcode,Llvm,以下代码非常安全,但Xcode 4给了我一个错误: if ([self respondsToSelector: @selector(foo)]) [self foo]; 我知道我可以用一个虚拟协议来解决这个问题,但是我经常使用这个模式,感觉不需要那么多的工作。有没有办法在某个地方设置一个设置,最好设置一次,这样这个“错误”就不会再次困扰我了?要在遵循这种模式时使编译器静音,我使用-performSelector: if ([self respondsToSelector
if ([self respondsToSelector: @selector(foo)])
[self foo];
我知道我可以用一个虚拟协议来解决这个问题,但是我经常使用这个模式,感觉不需要那么多的工作。有没有办法在某个地方设置一个设置,最好设置一次,这样这个“错误”就不会再次困扰我了?要在遵循这种模式时使编译器静音,我使用-performSelector:
if ([self respondsToSelector:@selector(foo)]) {
[self performSelector:@selector(foo)];
}
我不知道还有别的办法
if ([self respondsToSelector: @selector(foo)])
[self foo];
只有在没有参数和返回值的情况下,该表达式才是“完全安全的”。如果需要任何类型信息,@selector(foo)
不够
即使如此,我怀疑有些体系结构的ABI是这样的,即no-arg-no-return情况实际上需要编译器具备类型知识,才能生成绝对保证正确的代码
也就是说,由于C语言和特定于体系结构的ABI的变幻莫测,如果没有可用的完整类型信息,您的fooWithInteger:
和/或fooWithX:y:z:
示例可能无法正确编译
同样,要允许编译器在没有警告的情况下编译,需要编译器将运行时表达式--
respondsToSelector:
与编译时表达式合谋,必须动态调度--。编译器讨厌这样做。Ugh,如果我真正想做的是[self-fooWithInteger:2]。或者,更糟糕的是,[与X:1Y:2Z:3]的自食@威廉:真的。正是因为这个原因,我避免了类似的方法签名。我发现基于响应性有条件地发送消息的情况很少见,所以我还没有发现足够多的问题来探索其他选项。只有我的两分钱。@WilliamJockusch:你可以使用NSInvocation来做这件事。另一种绕过它的方法,除了协议(如你所提到的),就是声明一个公共方法。