2014-04-22 203 views
7

在我的應用程序有以下Objective-C代碼:LLVM循環優化錯誤?

-(void)layoutPages 
{ 
    NSMutableArray* sections = [NSMutableArray array]; 
    [sections addObject:[[NSAttributedString alloc] initWithString:@"Hello world"]]; 

    for (NSAttributedString* contentSection in sections) { 
     NSLog(@"%@",contentSection); 
    } 
} 

enter image description here

控制檯輸出:2014-04-22 14:11:01.505 MyApp[24784:830b] Hello world{}

如果我使用-Os優化編譯x86_64體系,LLVM然後靜靜地優化了循環變量'contentSection'。當我使用-O0時,錯誤消失。 這是輸出,當我嘗試打印contentSection變量的描述:

(lldb) po contentSection 
error: Couldn't materialize struct: the variable 'contentSection' has no location, it may have been optimized out 
Errored out in Execute, couldn't PrepareToExecuteJITExpression 

這怎麼可能?從我的角度來看,循環變量在循環內部使用時不應該被優化。我看到其他人與LLVM有類似的問題,但沒有使用循環變量。這可能是一個編譯器錯誤?

+0

你嘗試使用屬性self.contentSections而不是一個ivar –

+0

謝謝@PeterLapisu我試着用相同的結果。 – Sbhklr

+0

你是怎麼聲明'iVar'或'@ property'的?正如可能發生的情況是,更多的時間內存管理可能會發生在'-Os'和'_contentSections'正在被釋放。 – Rich

回答

3

這可能是一個編譯器設置問題。首先,您需要檢查您的運行方案是否處於發佈模式。進入「Edit scheme ...」 - >「Run」 - >「Info」 - >「Build Configuration」。確保該值設置爲「調試」。

如果這不是問題,那麼確保您的調試版本設置沒有打開編譯器優化。確保「優化級別」設置爲「無」用於調試。還要確保沒有其他可以設置編譯器優化級別的地方,比如在「其他C標誌」設置中。