Iphone Xcode 4/LLVM 3.0——使“;选择器“的实例方法未知”;错误?

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

以下代码非常安全,但Xcode 4给了我一个错误:

    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来做这件事。另一种绕过它的方法,除了协议(如你所提到的),就是声明一个公共方法。