【发布时间】:2012-03-01 03:42:37
【问题描述】:
我最近在编译 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)
【问题讨论】:
-
使用中断这可能是您更改了 my type 值的事实,如果您更改 casewhitout break 中的值,它将检查另一种情况。
-
@Radu:
returns 在 switch 块中是完全合法的。不知道你在改变类型。
标签: objective-c ios llvm