Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/cocoa/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Objective c 在Cocoa中声明对象时,是否应将其设置为nil?_Objective C_Cocoa_Macos - Fatal编程技术网

Objective c 在Cocoa中声明对象时,是否应将其设置为nil?

Objective c 在Cocoa中声明对象时,是否应将其设置为nil?,objective-c,cocoa,macos,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 st

假设我想创建一个
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.";

这两种方法的区别是什么?首选哪种方法?

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

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

范例 考虑下面的例子:

int abs;
if (argument > 0) abs = argument;
else if (argument < 0) abs = -1 * argument;
NSLog(@"%i", abs);
intabs;
如果(参数>0)abs=参数;
如果(参数<0)abs=-1*参数,则为else;
NSLog(@“%i”,abs);
这里,如果
参数
为0,则代码使
abs
变量未初始化。因此,您将记录随机值,然后导致程序其余部分中的值被破坏;而且很难发现问题出在哪里


如果使用未初始化的引用,则很可能会得到
EXC\u BAD\u访问

将变量设置为值或为零会使未初始化的值错误更容易在运行时发现

NSString *string = @"Foo is not one";
if(foo == 1)
    string = @"Foo is one.";
如今,各种编译器更擅长发现未初始化的值


将指针设置为nil(上次使用后)的一个客观原因是垃圾收集。

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

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

可以创建一个变量,并以未初始化状态开始,然后在稍后尝试读取该变量时,会出现垃圾和崩溃。将变量初始化为已知的初始状态,然后稍后对照该状态进行检查,这是一种很好的编码实践。

分配给nil的值在那里,这样就不会有人查看代码并担心变量永远处于未定义的状态

NSString *string;
NSLog(@"%p", string);
由于字符串的值未定义,该代码将打印一个垃圾值

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

NSString *string = (foo == 1) ? @"Foo is one." : @"Foo is not one.";
现在字符串的值总是被定义的。如果表达式变得复杂,行变长,只需使用中间变量

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