iphone - Xcode 4/LLVM 3.0——让它更智能地处理 "no known instance method for selector"错误?

标签 iphone objective-c ios xcode llvm

下面的代码是绝对安全的,但是 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/

相关文章:

iphone - 如何在 Objective-C 中绘制四分之一圆

ios - UICollectionView 的 cellForItemAtIndexPath 没有被调用

objective-c - 如何使用 Core Data 验证托管对象存储的 sqlite 文件

ios - 在 ipad/iphone 上设置不同的启动屏幕界面

ios - 创建线程安全单例的正确方法是什么?

iphone - 从 HTML 文件链接到 View

ios - UISegmentedControl 的 UIImage 项目数组不显示图像

ios - 异步连接中的 NSURLConnection 数据中断

ios - UITap 手势仅适用于一种 View

ios - iPhone 应用程序更新 : Ignore backwards compatibility for iOS 3. X(iOS 部署目标设置为 4.0)