我忘了初始化一个局部变量,当我使用它时没有得到任何警告。由于我使用的是ARC
,因此变量初始化为nil
,因此没有造成任何伤害,但是当我使用未初始化的值时,我仍然需要警告。如果我禁用ARC
,我会收到预期的警告。
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。这消除了警告的必要性。
答案 0 :(得分:4)
使用ARC,指向Objective C对象的指针会自动初始化为nil
,因此编译器可以警告没有“未初始化的值”。
答案 1 :(得分:2)
Clang有一个选项-Wuninitialized
看起来应该做你想做的事情,但正如另一个答案所指出的那样,保证变量在ARC下初始化为0
/ nil
答案 2 :(得分:0)
使用ARC,会自动指向Objective C对象 初始化为零,所以没有“未初始化的价值” 编译器可以警告。
但是,我通过使用本地块来初始化变量完全避免了这个问题。该块保证所有路径都以return
结尾,这意味着我的变量可以保证初始化。
这样的例子就这样写了:
NSString *foo = ^{
if (bar) {
return @"fizz";
} else {
return @"buzz";
}
}();
NSLog(@"foo: %@", foo); // foo: (fizz|buzz)
该块是堆栈分配的,因此它不会产生超出正常函数调用的任何开销。