我忘了初始化一個局部變量,當我使用它時我沒有任何警告。由於我使用的是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。這消除了警告的需要。
雖然沒有「未初始化的值」,但編譯器可以提出警告,也沒有一個用於整數。未初始化的警告是通過對源代碼的簡單分析完成的,在第一次使用之前是否有分配?此測試的邏輯存在於Clang中,並仍用於值類型。簡單的叮噹設計師*在這種情況下選擇*不要給出警告。如果您希望警告將提交請求提交給Apple。 – CRD
@CRD:我只是重新閱讀你的評論,我不確定我是否正確理解它。 [Clang/ARC](http://clang.llvm.org/docs/AutomaticReferenceCounting.html#semantics)文檔陳述了「可保留對象指針類型的對象」:*「初始化發生在對象的生命週期開始時......首先,使用原語語義「*」將空指針存儲到左值。 - 所以在第一次使用(由ARC編譯器生成)之前,有一個*顯式賦值給變量,而不是其他變量(如整數)。這就是爲什麼你沒有得到警告。 –
可以將初始化描述爲由編譯器添加的* implicit *賦值,它不是源*中的* explicit *。因此,如果在第一次使用之前沒有做出明確的分配,那麼也執行分配分析的編譯器在警告中不會面臨*技術*原因。這樣的分析要求「有這個*變量*被分配到了嗎?」這是類型(和值 - 無「非空值」)獨立。但是,是否有利於發出警告是值得商榷的;有些將基於此編碼,其他(例如,g OP)不會。編譯器開關/編譯指示可能是合理的。 – CRD