其实我的问题是:null
和nil
等价与否?
我有一个例子,但是当他们不相同时,我很困惑。
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");
}
}
在上面的例子中,它表明null
和nil
都不相等,它显示“等于NSNull实例”
NSString *str=NULL;
id str1=nil;
if(str1 == str)
{
printf("\n IS EQUAL........");
}
else
{
printf("\n NOT EQUAL........");
}
在第二种情况下,它显示两者相等,并显示“IS EQUAL”。
任何人的帮助将不胜感激。
谢谢你, Monish。
答案 0 :(得分:22)
nil
和NULL
基本相同,nil
类似于(NSObject *)0
,而NULL
更像(void *)0
。但两者都是整数值为零的指针。您可以向nil
发送消息,而不会产生错误。
NSNull
和NULL
(或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
nil
和NULL
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"];
然后,对于NSNULL
为name
的任何部门,您将拥有nil
个对象。所以,这会导致崩溃:
for (NSString *name in departmentNames)
NSLog(@"%@", [name lowercaseString]);
只要name
为NSNull
,因为您刚刚将未知选择器(lowercaseString
)发送到NSNull
。
课程:在向其元素发送任何消息之前检查数组中的NSNull
对象。
for (NSString *name in departmentNames)
if (name != [NSNull null])
NSLog(@"%@", [name lowercaseString]);
答案 4 :(得分:1)
不,NSNull
和nil
不一样。它们都代表缺乏价值,你可能想要对它们进行相同的处理,但它们仍然不相同。
NSNull
对象实例表示空值,例如,当您从具有空值的数据库中读取数据时。
nil
值是空指针,即它不指向任何对象实例。
在您的第二个代码中,您没有任何NSNull
实例。包含空指针的NSString
指针不是NSNull
实例,它仍然只是一个空指针。您正在将一个空指针与另一个指针进行比较,它们当然是相等的。
答案 5 :(得分:1)
确保将[NSNull null]类型转换为您要比较的对象类型
NSArray list;
if(list==(NSArray *)[NSNull null])
// do something
否则你会收到一条警告信息“不同指针类型的比较('type *'和'NSNull *')