下面的代码是完全安全的,但是Xcode 4给了我一个错误:
if ([self respondsToSelector: @selector(foo)])
[self foo];
我知道我可以使用虚拟协议来绕过它,但我经常使用这种模式,感觉不应该有那么多工作。有没有办法在某个地方设置一个设置,最好是一次,这样这个“错误”就不会再次困扰我了?
发布于 2011-08-03 12:04:19
if ([self respondsToSelector: @selector(foo)])
[self foo];
这个表达式只有在没有参数和返回值的情况下才是“完全安全的”。如果需要任何类型信息,则@selector(foo)
是不够的。
即使这样,我怀疑有些体系结构的ABI是这样的,以至于无参数无返回的情况实际上要求编译器能够获得类型知识,以便能够生成绝对保证正确的代码。
也就是说,由于C语言和特定于体系结构的ABI的反复无常,如果没有可用的完整类型信息,您的fooWithInteger:
和/或fooWithX:y:z:
示例不可能被正确编译。
同样,为了允许编译器在没有警告的情况下进行编译,将需要编译器将运行时表达式与编译时表达式串连在一起--动态分派( respondsToSelector:
be )。编译器讨厌这一点。
发布于 2011-08-03 10:17:24
为了让编译器在遵循这种模式时保持安静,我使用了-performSelector:
if ([self respondsToSelector:@selector(foo)]) {
[self performSelector:@selector(foo)];
}
我不知道有没有别的办法。
https://stackoverflow.com/questions/6920933
复制相似问题