5

将变量初始化为好习惯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

4 回答 4

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];
}
...
于 2012-02-09T17:43:31.453 回答
5

是的。如果 q 没有被初始化为 nil,它将有一个随机值,这可能会在以后的执行中引入隐藏的 bug。

于 2012-02-09T17:26:28.283 回答
0

是的,这很好。Nil 只是另一种说法,这个变量不指向内存中的任何内容。

于 2012-02-09T17:24:37.873 回答
0

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

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

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

在这里编译器可以警告你,因为你可能会返回一个未定义的结果。如果将结果初始化为 nil,您仍然会遇到同样的问题,即您可能会在不应返回 nil 的函数中返回 nil,但编译器无法警告您。

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

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

于 2014-07-15T12:47:51.303 回答