在Cocoa中声明对象时,我应该将它们设置为nil吗?

时间:2009-08-11 19:36:28

标签: objective-c cocoa macos

假设我想要创建NSString的实例,该实例根据另一个变量的值初始化为某个值。通常,我会这样做

NSString *string;
if(foo == 1)
    string = @"Foo is one.";
else
    string = @"Foo is not one.";

然而,在我看过的一些示例代码中,我看到过人们

NSString *string = nil;
if(foo == 1)
    string = @"Foo is one.";
else
    string = @"Foo is not one.";

这两者之间有什么区别,首选哪种方法?

4 个答案:

答案 0 :(得分:6)

我个人的偏好是立即初始化任何变量。但是,在您提供的示例中,这两种方法是等效的。

C种语言(即CC++Obj-C)未立即初始化的变量可能包含随机垃圾值。在变量初始化之前使用该变量会导致意外行为(从希望崩溃到意外行为)。

实施例的 请考虑以下示例:

int abs;
if (argument > 0) abs = argument;
else if (argument < 0) abs = -1 * argument;
NSLog(@"%i", abs);

如果abs为0,代码会保留argument变量未初始化。因此,您将记录随机值,然后导致破坏程序其余部分的值;并且很难发现问题所在!

如果您使用未初始化的参考,则很可能会获得EXC_BAD_ACCESS

答案 1 :(得分:2)

对nil的赋值是这样的,所以没有人看过代码并担心变量永远处于未定义状态。

NSString *string;
NSLog(@"%p", string);

该代码将打印一个垃圾值,因为字符串的值未定义。

我更喜欢使用ternary运算符,而不是像您的示例中那样编写代码。这是一个例子:

NSString *string = (foo == 1) ? @"Foo is one." : @"Foo is not one.";

现在始终定义字符串的值。如果表达式变得复杂,并且行变长,只需使用中间变量。

解决许多问题的最佳方法是消除问题。这就是这样。

答案 2 :(得分:1)

将变量设置为值或nil可以使运行时更容易发现未初始化的值错误。

NSString *string = @"Foo is not one";
if(foo == 1)
    string = @"Foo is one.";

如今,各种编制者更善于发现未初始化的价值观。

设置指向nil(在最后一次使用之后)的指针的一个目标C原因是垃圾收集。

答案 3 :(得分:0)

通常,您可能会将变量设置为nil,以确保从变量的已知值状态开始。所以你知道变量是nil开始然后你可以将变量与nil进行比较。一个很好的例子是使用NSError进行错误检查,如此

NSError *error = nil;
[SomeCocoaClass performOperationWithObject:obj error:&error];
if(nil != error){
//handle error
}

可以创建一个变量并以未初始化状态开始,然后当你尝试在以后读取该变量时,你会得到垃圾和崩溃。将变量初始化为已知的初始状态然后在以后检查该状态只是一个很好的编码实践。