首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Xcode4/LLVM3.0 --让“选择器没有已知的实例方法”的错误变得更聪明一些?

Xcode4/LLVM3.0 --让“选择器没有已知的实例方法”的错误变得更聪明一些?
EN

Stack Overflow用户
提问于 2011-08-03 10:13:43
回答 2查看 542关注 0票数 3

下面的代码是完全安全的,但是Xcode 4给了我一个错误:

代码语言:javascript
运行
复制
    if ([self respondsToSelector: @selector(foo)])
        [self foo];

我知道我可以使用虚拟协议来绕过它,但我经常使用这种模式,感觉不应该有那么多工作。有没有办法在某个地方设置一个设置,最好是一次,这样这个“错误”就不会再次困扰我了?

EN

回答 2

Stack Overflow用户

发布于 2011-08-03 12:04:19

代码语言:javascript
运行
复制
if ([self respondsToSelector: @selector(foo)])
    [self foo];

这个表达式只有在没有参数和返回值的情况下才是“完全安全的”。如果需要任何类型信息,则@selector(foo)是不够的。

即使这样,我怀疑有些体系结构的ABI是这样的,以至于无参数无返回的情况实际上要求编译器能够获得类型知识,以便能够生成绝对保证正确的代码。

也就是说,由于C语言和特定于体系结构的ABI的反复无常,如果没有可用的完整类型信息,您的fooWithInteger:和/或fooWithX:y:z:示例不可能被正确编译。

同样,为了允许编译器在没有警告的情况下进行编译,将需要编译器将运行时表达式与编译时表达式串连在一起--动态分派( respondsToSelector: be )。编译器讨厌这一点。

票数 4
EN

Stack Overflow用户

发布于 2011-08-03 10:17:24

为了让编译器在遵循这种模式时保持安静,我使用了-performSelector:

代码语言:javascript
运行
复制
if ([self respondsToSelector:@selector(foo)]) {
    [self performSelector:@selector(foo)];
}

我不知道有没有别的办法。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/6920933

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档