将变量初始化为nil是一种好习惯吗?

时间:2012-02-09 17:22:36

标签: objective-c ios null clang-static-analyzer

将变量初始化为nil是不错的做法?

我问这是因为当我在我的项目上运行分析器时,我会收到警告。

 NSString *q;

    if(sqlite3_prepare_v2(database, [query UTF8String], -1, &statement, nil) == SQLITE_OK)
    {
        sqlite3_step(statement);
        selectedQuestion =[NSString stringWithFormat: @"%s",(char *)sqlite3_column_text(statement, 0)];
        sqlite3_finalize(statement);
    }

    sqlite3_close(database);

    return q; //Undefined or garbage value returned to caller

当我更改代码时,警告消失了:

NSString *q = nil;

4 个答案:

答案 0 :(得分:11)

如果您使用的是ARC,那么您的指针将自动指定为nil。但是,我不相信你在使用ARC,在这种情况下指针将具有垃圾值。这是危险的,因为调用该函数的人可以接收结果并相信指针指向有效的东西,因为它不等于nil。

所以......是的, 总是将指针初始化为nil或有效值。

示例1 ::首先不需要分配给nil的好示例:

UIViewController *myVC = [[[UIViewController] alloc] init] autorelease];

示例2 ::不需要先分配给nil的错误示例:

UIViewController *myVC = nil;  // dumb since next line assigns it to valid value
myVC = [[[UIViewController] alloc] init] autorelease];

示例3 ::分配给nil的好例子,因为它会有条件地获得新值

UIViewController *myVC = nil;  // :D
if (someCondition)
{
   myVC = [[[UIViewController] alloc] init] autorelease];
}
...

答案 1 :(得分:5)

是。如果q未初始化为nil,则它将具有随机值,这可能会在以后的执行中引入隐藏的错误。

答案 2 :(得分:0)

是的,这完全没问题。 Nil只是另一种说法,这个变量并没有指向内存中的任何东西。

答案 3 :(得分:0)

在使用之前将任何变量设置为某个定义值是非常好的做法。不这样做会导致各种各样的问题。其余的很大程度上取决于您使用的工具。

一个好的编译器会告诉你是否使用了一个在使用它之前没有定义的变量,或者在你使用之前编译器无法证明它已被定义的变量。糟糕的编译器(或者不熟悉如何正确使用其工具的开发人员使用的良好编译器)不会这样做。使用良好的编译器,初始化为nil或NULL可能会阻止编译器正常工作。考虑这个例子,你真的希望代码返回的NSString不是没有,但没有做到:

NSString* result;
if (condition) result = @"True";
else if (otherCondition) result = @"False";
return result;

这里编译器可以警告您,因为您可能会返回未定义的结果。如果将结果初始化为nil,则仍然存在相同的问题,即在不应该返回nil的函数中返回nil,但编译器无法向您发出警告。

另一方面,如果值必须为零,或者nil是可接受的值,并且您计划在某些情况下不将变量设置为其他值,则初始化为nil很好,很好的做法。

摘要:使用编译器并正确设置它,以便它告诉您是否使用了未初始化的变量。如果您收到有关未初始化变量的警告,请修复问题,而不是警告。