如果我在使用ARC时无法初始化变量,clang怎么警告我?

时间:2012-10-16 18:46:16

标签: objective-c automatic-ref-counting clang clang-static-analyzer

我忘了初始化一个局部变量,当我使用它时没有得到任何警告。由于我使用的是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。这消除了警告的必要性。

3 个答案:

答案 0 :(得分:4)

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

答案 1 :(得分:2)

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

答案 2 :(得分:0)

Martin R is correct

  

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

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

这样的例子就这样写了:

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

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