2

我忘了初始化一個局部變量,當我使用它時我沒有任何警告。由於我使用的是ARC,變量初始化爲nil,所以沒有造成任何傷害,但我仍然希望在使用未初始化的值時發出警告。如果我禁用ARC,我會收到我期望的警告。如果在使用ARC時未能初始化變量,clang會如何警告我?

NSString *foo; 
NSString *baz; 
if (bar) { 
    foo = @"fizz"; 
} else { 
    foo = @"buzz"; 
} 
NSLog(@"foo: %@", foo); // foo: (fizz|buzz) 
NSLog(@"baz: %@", baz); // baz: (null) 

沒有ARC:

/blah/blah/blah/Blah.m:14:18: note: initialize the variable 'foo' to silence this warning 
NSString *foo; 
      ^

- 編輯 -

I've figured out how to make uninitialized values impossible using local blocks。這消除了警告的需要。

回答

4

使用ARC時,指向Objective C對象的指針會自動初始化爲nil,所以不存在編譯器可以警告的「未初始化值」。

+0

雖然沒有「未初始化的值」,但編譯器可以提出警告,也沒有一個用於整數。未初始化的警告是通過對源代碼的簡單分析完成的,在第一次使用之前是否有分配?此測試的邏輯存在於Clang中,並仍用於值類型。簡單的叮噹設計師*在這種情況下選擇*不要給出警告。如果您希望警告將提交請求提交給Apple。 – CRD

+0

@CRD:我只是重新閱讀你的評論,我不確定我是否正確理解它。 [Clang/ARC](http://clang.llvm.org/docs/AutomaticReferenceCounting.html#semantics)文檔陳述了「可保留對象指針類型的對象」:*「初始化發生在對象的生命週期開始時......首先,使用原語語義「*」將空指針存儲到左值。 - 所以在第一次使用(由ARC編譯器生成)之前,有一個*顯式賦值給變量,而不是其他變量(如整數)。這就是爲什麼你沒有得到警告。 –

+0

可以將初始化描述爲由編譯器添加的* implicit *賦值,它不是源*中的* explicit *。因此,如果在第一次使用之前沒有做出明確的分配,那麼也執行分配分析的編譯器在警告中不會面臨*技術*原因。這樣的分析要求「有這個*變量*被分配到了嗎?」這是類型(和值 - 無「非空值」)獨立。但是,是否有利於發出警告是值得商榷的;有些將基於此編碼,其他(例如,g OP)不會。編譯器開關/編譯指示可能是合理的。 – CRD

2

鐺有一個選項-Wuninitialized看起來應該做你想做的事,但正如在另一個答案中指出的,變量保證初始化爲ARC下的0/nil

+1

不幸的是,這個選項似乎不適用於對象引用(適用於值類型),至少在Clang 4.4中。該選項由Xcode項目設置中的「未初始化的變量」開關設置。 – CRD

0

Martin R is correct

隨着ARC,指針到目標C的對象是自動初始化 爲nil,所以沒有「未初始化值」其中 編譯器可以發出警告。

但是,我通過使用本地塊來初始化變量,完全避免了這個問題。該塊保證所有路徑以return結尾,這意味着我的變量保證被初始化。

的例子是寫的正是如此:

NSString *foo = ^{ 
    if (bar) { 
     return @"fizz"; 
    } else { 
     return @"buzz"; 
    } 
}(); 
NSLog(@"foo: %@", foo); // foo: (fizz|buzz) 

該塊棧上分配的,所以它不會產生超出正常的函數調用的任何開銷。

相關問題