是NULL和零等价?

其实我的问题是:
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。     
已邀请:
nil
NULL
基本相同,
nil
类似于
(NSObject *)0
,而
NULL
更像是
(void *)0
。但两者都是整数值为零的指针。您可以发送消息至
nil
而不会引发错误。 然而,
NSNull
NULL
(或当然是
nil
)是不同的东西。您只需使用
NSNull
作为助手将
empty
对象添加到
NSArray
或其他容器类,因为您无法向它们添加
nil
。所以相反,你使用
[NSNull null]
作为替代,你必须检查数组元素是否为
NSNull
,而不是它是
nil
(它永远不会等于
nil
)。     
来自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,我认为 - 所以在实践中它并不重要。     
概念是相同的,区别在于将消息(调用方法)发送到nil是有效的。 NSNull是一个真实的(单例)类,可用于不接受NULL或nil值的数组或字典。     
它们之间最大的区别是:向
NSNULL
对象发送消息可能会导致崩溃,而将任何消息发送到
nil
很酷。例如,如果使用键路径来获取数组,如下所示:
NSArray *departmentNames = [departments valueForKey:@"name"];
然后,对于任何
name
nil
的部门,你将拥有一个
NSNULL
对象。所以,这会导致崩溃:
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]);
    
不,
NSNull
nil
不一样。它们都代表缺乏价值,你可能想要对它们进行相同的处理,但它们仍然不相同。
NSNull
对象实例表示空值,例如,当您从具有空值的数据库中读取数据时。
nil
值是空指针,即它不指向任何对象实例。 在你的第二个代码中,你没有任何
NSNull
实例。包含空指针的
NSString
指针不是
NSNull
实例,它仍然只是一个空指针。您正在将一个空指针与另一个指针进行比较,它们当然是相等的。     
确保将[NSNull null]类型转换为要比较的对象类型
NSArray list;
if(list==(NSArray *)[NSNull null])
    // do something
否则你会收到一条警告信息“不同指针类型的比较('type *'和'NSNull *')     

要回复问题请先登录注册