Objective c LLVM 3.0上switch语句的意外行为
我最近在编译iOS应用程序时从LLVM GCC 4.2切换到了LLVM 3.0编译器。除了我的一些switch语句外,所有的东西似乎都是一样的。在开关条件下直接使用Obj-C方法时,似乎有问题 我已经创建了下面的main.m文件来重现这一点。它正在打印Objective c LLVM 3.0上switch语句的意外行为,objective-c,ios,llvm,Objective C,Ios,Llvm,我最近在编译iOS应用程序时从LLVM GCC 4.2切换到了LLVM 3.0编译器。除了我的一些switch语句外,所有的东西似乎都是一样的。在开关条件下直接使用Obj-C方法时,似乎有问题 我已经创建了下面的main.m文件来重现这一点。它正在打印属性:846,而它应该清楚地打印属性:2。我使用switch有什么问题吗?或者这可能是编译器中的错误吗 #import <Foundation/Foundation.h> @interface STSomeClass : NSObje
属性:846
,而它应该清楚地打印属性: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];
}
#导入
@接口STSomeClass:NSObject
@结束
@STSomeClass的实现
-(int)mytype{
返回2;
}
-(int)someProperty{
开关([self mytype]){
案例1:
案例2:
案例3:
案例6:
案例8:
案例9:
返回2;
案例4:
案例7:
返回1;
违约:
返回0;
}
}
-(void)printSomeProperty{
printf(“属性:%d\n”,[self someProperty]);
}
@结束
int main(int argc,char*argv[])
{
STSomeClass*someObject;
someObject=[[STSomeClass alloc]init];
[someObject printSomeProperty];
[物体释放];
}
更新:
为了明确我是如何编译代码的:
- 我正在Mac OS X 10.6.8上使用Xcode 4.2和iOS SDK 5.0
- 使用LLVM3.0
- 使用-Os编译代码(也尝试了-O1)
- 构建arvm7并在配备iOS 4.2.1的iPad上进行测试(还尝试了配备iOS 5.0的iPhone4)
所以,在你的情况下还有其他的事情。您使用的确切配置是什么?使用中断可能是因为您更改了“我的类型”值,如果您更改了一个案例中的值,则中断将检查另一个案例。@Radu:
return
s在开关块中是完全合法的。我不知道你在说什么来改变类型。对不起,我忘记提了。我正在iPad上测试它(也在iPhone4上测试过),并使用-Os标志编译。看起来我无法下载Xcode 4.4并使用llvm 4.0进行测试。只有Mac开发人员才能访问它吗?我尝试了-Os,在运行iSO 5.0.1的iPad2上仍然得到了正确的结果。不过,缺少自动释放池确实让我担心。谢谢你的尝试。这似乎与我的配置非常接近。我想知道为什么我会看到不同的结果。我删除了@autoreleasepool块,只是为了用LLVM GCC 4.2编译器测试它。添加它没有任何区别。当3.1还在开发中,最新版本是3.0时,你从哪里得到LLVM4.0?