2

我忘记初始化一个局部变量,使用它时没有收到任何警告。由于我使用的是 ,所以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;
             ^

- 编辑 -

我已经想出了如何使用 local blocks 使未初始化的值变得不可能。这消除了对警告的需要。

4

3 回答 3

5

使用 ARC,指向 Objective C 对象的指针会自动初始化为nil,因此没有编译器可以警告的“未初始化值”。

于 2012-10-16T18:49:06.970 回答
2

Clang 有一个-Wuninitialized看起来应该做你想做的事情的选项,但正如在另一个答案中指出的那样,变量保证被初始化为0/nil在 ARC 下。

于 2012-10-16T18:54:13.663 回答
0

马丁 R 是正确的

使用 ARC,指向 Objective C 对象的指针会自动初始化为 nil,因此没有编译器可以警告的“未初始化值”。

但是,我通过使用本地块来初始化变量完全避免了这个问题。该块保证所有路径都以 a 结尾return,这意味着保证我的变量被初始化。

该示例将这样编写:

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

该块是堆栈分配的,因此它不会产生超出正常函数调用的任何开销。

于 2016-06-09T18:14:11.793 回答