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

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

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

我已经创建了下面的main.m文件来重现这一点。它正在打印
属性: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)

我用两种方法尝试了这段代码:Xcode 4.4、llvm 4.0、ARC和Xcode 4.3、llvm 3、1无ARC,这两种方法都使用OS X 10.7.3、iOS 4.3目标和iOS 5.0。模拟器,两次都得到“属性:2”


所以,在你的情况下还有其他的事情。您使用的确切配置是什么?

使用中断可能是因为您更改了“我的类型”值,如果您更改了一个案例中的值,则中断将检查另一个案例。@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?