17

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");
    }
}

在上述情况下,它显示两者nullnil不相等,并显示“等于 NSNull 实例”

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

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

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

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

谢谢你,莫尼什。

4

6 回答 6

22

nilNULL本质上是一样的,nil有点像(NSObject *)0,而NULL更像(void *)0。但两者都是整数值为零的指针。nil您可以在不引发错误的情况下发送消息。

NSNullNULL(或者nil,当然)是不同的东西,但是。您只是用作将对象NSNull添加到一个或另一个容器类的助手,因为您无法添加到它们。因此,您将其用作替代品,并且您必须检查数组元素是否为,而不是是否为(它永远不会等于)。emptyNSArraynil[NSNull null]NSNullnilnil

于 2010-03-17T11:09:41.707 回答
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——所以在实践中这并不重要。

于 2010-07-03T04:16:08.023 回答
2

概念是相同的,不同之处在于向 nil 发送消息(调用方法)是有效的。

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

于 2010-03-17T11:07:54.253 回答
2

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

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

然后,您将拥有NSNULL任何部门的对象,其namenil. 因此,这将导致崩溃:

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]);
于 2012-01-30T20:12:45.900 回答
1

不,NSNull而且nil不一样。它们都代表缺乏价值,您可能希望对它们一视同仁,但它们仍然不平等。

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

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

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

于 2010-03-17T11:12:34.320 回答
1

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

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

否则您将收到一条警告消息,说“不同指针类型的比较('type *' and 'NSNull *')

于 2012-10-09T14:56:14.300 回答