objective-c - LLVM 3.0 上 switch 语句的意外行为

标签 objective-c ios llvm

我最近在编译 iOS 应用程序时从 LLVM GCC 4.2 切换到 LLVM 3.0 编译器。一切似乎都一样,除了我的一些 switch 语句。直接在 switch 条件中使用 Obj-C 方法似乎有问题。

我在下面创建了 main.m 文件来重现它。它正在打印 property: 846 而它应该清楚地打印 property: 2。我对 switch 的使用有什么问题吗?或者这可能是编译器中的错误?

#import <Foundation/Foundation.h>

@interface STSomeClass : NSObject
@end

@implementation STSomeClass

- (int)mytype{
  return 2;
}

- (int)someProperty{
  switch ([self mytype]) {
    case 1:
    case 2:
    case 3: 
    case 6: 
    case 8:
    case 9:
        return 2;
    case 4:
    case 7:
        return 1;
    default:
        return 0;
  }
}

- (void)printSomeProperty{
  printf("property: %d\n", [self someProperty]);
}

@end

int main(int argc, char *argv[])
{
  STSomeClass* someObject;

  someObject = [[STSomeClass alloc] init];
  [someObject printSomeProperty];
  [someObject release];
}

更新:

为了弄清楚我是如何编译代码的:

  • 我在 Mac OS X 10.6.8 上使用 Xcode 4.2 和 iOS SDK 5.0
  • 使用 LLVM 3.0
  • 使用-Os 编译代码(也试过-O1)
  • 为 arvm7 构建并在装有 iOS 4.2.1 的 iPad 上进行测试(也尝试过装有 iOS 5.0 的 iPhone 4)

最佳答案

我以两种方式尝试了此代码:Xcode 4.4、llvm 4.0、ARC 和 Xcode 4.3、llvm 3,1 no-ARC 均与 OS X 10.7.3、iOS 4.3 目标和 iOS 5.0。模拟器,两次都得到“property: 2”。

所以,您的情况还有其他问题。您使用的具体配置是什么?

关于objective-c - LLVM 3.0 上 switch 语句的意外行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9498542/

相关文章:

ios - 调用什么函数来撤消在 UITextField 中所做的更改?

c++ - 如何将 llvm::MemoryBuffer 的内容作为 std::string 获取?

objective-c - 是否可以定义一个符合协议(protocol)的Class类型的属性?

ios - 将数组添加到 PLIST

objective-c - 是否可以获得正在运行的应用程序窗口的完整列表?

llvm - 将 GetElementPtrInst 与包含多个值的 ArrayRef 一起使用时出现段错误

llvm - 调试LLVM IR

iOS 应用内购买无后端

ios - 如何从带有多个主题标签的 instagram 获取图像?

ios - 为什么CKRecordZone对象的属性“capabilities”的值等于7?