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

Jor*_*Kay 3 macos cocoa objective-c

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

NSString *string;
if(foo == 1)
    string = @"Foo is one.";
else
    string = @"Foo is not one.";
Run Code Online (Sandbox Code Playgroud)

但是,在我看到的一些示例代码中,我见过人们这样做

NSString *string = nil;
if(foo == 1)
    string = @"Foo is one.";
else
    string = @"Foo is not one.";
Run Code Online (Sandbox Code Playgroud)

这两者有什么区别,哪种方法更受欢迎?

not*_*oop 6

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

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

示例 考虑以下示例:

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

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

如果你使用未初始化的参考,你很可能会得到一个EXC_BAD_ACCESS.