初始化变量为nil是一个好的实践吗?

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;

1
请注意编译器应该对该模式进行大声的投诉。更好的想法是不要重新发明轮子,而是直接使用sqlite API;有第三方包装器可以为您提供更高级别的API,这将使开发更快,或者您可以使用Core Data,这将为您提供与整个系统更好的集成。 - bbum
感谢bbum的评论。你说得完全正确。 - objlv
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];
}
...

5

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


我不明白为什么零值比随机值更少出现错误。 - user1157123
例如,如果返回值在稍后的块中使用,或被其他实例保留,它将会崩溃。 - ZelluX
我认为他们在iOS 5中更改了这一点,以自动将变量初始化为nil。 - John Koerner
2
@JohnKoerner 如果你正在使用ARC,变量将自动分配为nil。 - Sam
1
@infact:nil是一个对象指针的安全值,因为可以向nil发送消息而不会导致崩溃。使用未初始化的变量也是"未定义行为" - jscs

0

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

一个好的编译器会告诉您是否在使用变量之前定义了它,或者编译器无法证明在使用变量之前已经定义了它。一个糟糕的编译器(或者由不知道如何正确使用工具的开发人员使用的好编译器)不会这样做。对于一个好的编译器,将变量初始化为nil或NULL可能会阻止编译器正常工作。考虑以下示例,您真正想要代码返回一个不是nil的NSString,但却没有得到正确的结果:

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

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

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

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


0

没问题,这很好。Nil 只是另一种说法,表示该变量不指向内存中的任何内容。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接