2012-02-29 129 views
1

我最近在編譯iOS應用程序時從LLVM GCC 4.2切換到LLVM 3.0編譯器。一切似乎都一樣,除了我的一些switch語句。在開關條件下直接使用Obj-C方法時,看起來有些問題。LLVM 3.0上的switch語句出現意外的行爲

我已經創建了下面的main.m文件來重現這一點。它打印property: 846,而它應該清楚地打印property: 2。我的開關使用有什麼問題嗎?或者這可能是編譯器中的錯誤?

#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]; 
} 

UPDATE

要清楚我是怎麼編譯代碼:

  • 我使用的Xcode 4.2和iOS SDK 5.0的Mac OS X 10.6.8
  • 使用LLVM 3.0
  • 用-Os編譯代碼(也嘗試過-O1)
  • 構建arvm7並在iOS 4.2.1上測試iPad(也嘗試使用iOS 5.0的iPhone 4)
+0

使用中斷可能是因爲你改變了我的類型值,如果你改變了一個case中的值,break會檢查另一個case。 – Radu 2012-02-29 11:52:10

+3

@Radu:切換塊中的'return'是完全合法的。不知道你在改變類型。 – pmdj 2012-02-29 12:28:56

回答

2

我試過這段代碼有兩種方法: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」兩次。

所以,你的情況還有其他的事情發生。你使用了什麼確切的配置?

+0

抱歉,我忘了提及它。我正在iPad上測試它(也在iPhone 4上測試過)並使用-Os標誌進行編譯。 – murat 2012-02-29 12:24:21

+0

看起來我不能下載Xcode 4.4並使用llvm 4.0進行測試。 Mac開發人員只能訪問它嗎? – murat 2012-02-29 12:36:07

+0

我試過-Os,在運行iSO 5.0.1的iPad2上仍然得到了正確的結果。但缺乏autorelease池確實讓我擔心。 – zaph 2012-02-29 12:38:13