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.";
现在字符串的值总是被定义的。如果表达式变得复杂,行变长,只需使用中间变量
解决许多问题的最好办法就是消除问题。就是这样