是NULL和零等价?

时间:2010-03-17 10:56:27

标签: objective-c null nsnull

其实我的问题是:nullnil等价与否?

我有一个例子,但是当他们不相同时,我很困惑。

NSNull *nullValue = [NSNull null];
NSArray *arrayWithNull = [NSArray arrayWithObject:nullValue];
NSLog(@"arrayWithNull: %@", arrayWithNull);
id aValue = [arrayWithNull objectAtIndex:0];

if (aValue == nil) {
    NSLog(@"equals nil");
} else if (aValue == [NSNull null]) {
    NSLog(@"equals NSNull instance");
    if ([aValue isEqual:nil]) {
        NSLog(@"isEqual:nil");
    }
}

在上面的例子中,它表明nullnil都不相等,它显示“等于NSNull实例”

NSString *str=NULL;
id str1=nil;
if(str1 == str)
{
   printf("\n IS EQUAL........");

}
else
{
    printf("\n NOT EQUAL........");
}

在第二种情况下,它显示两者相等,并显示“IS EQUAL”。

任何人的帮助将不胜感激。

谢谢你, Monish。

6 个答案:

答案 0 :(得分:22)

nilNULL基本相同,nil类似于(NSObject *)0,而NULL更像(void *)0。但两者都是整数值为零的指针。您可以向nil发送消息,而不会产生错误。

然而,

NSNullNULL(或nil)是不同的事情。您只需使用NSNull作为帮助程序将empty对象添加到NSArray或其他容器类,因为您无法向其添加nil。因此,您使用[NSNull null]作为替代,您必须检查数组元素是NSNull,而不是nil(它永远不会等于nil )。

答案 1 :(得分:7)

来自http://www.iphonedevsdk.com/forum/iphone-sdk-development/34826-nil-vs-null.html

nilNULL 100%可互换。

来自:

  • NULL用于C风格的内存指针。
  • nil适用于Objective-C对象。
  • Nil适用于Objective-C类。

每当您编写Objective-C代码时,请使用nil 每当您编写C代码时,请使用NULL

但最终他们被定义为同样的事情 - (void *)0,我认为 - 所以在实践中它并不重要。

答案 2 :(得分:2)

概念是相同的,区别在于将消息(调用方法)发送到nil是有效的。

NSNull是一个真实的(单例)类,可用于不接受NULL或nil值的数组或字典。

答案 3 :(得分:2)

它们之间最大的区别:向NSNULL对象发送消息可能会导致崩溃,而向nil发送任何消息都很酷。例如,如果使用键路径来获取数组,则如下所示:

NSArray *departmentNames = [departments valueForKey:@"name"];

然后,对于NSNULLname的任何部门,您将拥有nil个对象。所以,这会导致崩溃:

for (NSString *name in departmentNames)
    NSLog(@"%@", [name lowercaseString]);

只要nameNSNull,因为您刚刚将未知选择器(lowercaseString)发送到NSNull

课程:在向其元素发送任何消息之前检查数组中的NSNull对象。

for (NSString *name in departmentNames)
    if (name != [NSNull null])
         NSLog(@"%@", [name lowercaseString]);

答案 4 :(得分:1)

不,NSNullnil不一样。它们都代表缺乏价值,你可能想要对它们进行相同的处理,但它们仍然不相同。

NSNull对象实例表示空值,例如,当您从具有空值的数据库中读取数据时。

nil值是空指针,即它不指向任何对象实例。

在您的第二个代码中,您没有任何NSNull实例。包含空指针的NSString指针不是NSNull实例,它仍然只是一个空指针。您正在将一个空指针与另一个指针进行比较,它们当然是相等的。

答案 5 :(得分:1)

确保将[NSNull null]类型转换为您要比较的对象类型

NSArray list;
if(list==(NSArray *)[NSNull null])
    // do something

否则你会收到一条警告信息“不同指针类型的比较('type *'和'NSNull *')