是NULL和零等价?

mon*_*ish 17 null objective-c 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");
    }
}
Run Code Online (Sandbox Code Playgroud)

在这里,在上述情况下,它表明,无论nullnil不相等并显示"等于NSNull实例"

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

}
else
{
    printf("\n NOT EQUAL........");
}
Run Code Online (Sandbox Code Playgroud)

在第二种情况下,它显示两者相等,并显示"IS EQUAL".

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

谢谢Monish.

MrM*_*age 22

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

NSNull然而,NULL(或者nil当然)是不同的东西.您只需NSNullempty对象用作向NSArray另一个容器类添加对象,因为您无法添加nil它们.所以相反,你[NSNull null]用作替换,你必须检查数组元素是否是NSNull,而不是它nil(它永远不会等于nil).

  • @Warren P:FWIW,你可以使用==来比较`[NSNull null]`,因为它保证总是返回相同的对象实例. (4认同)
  • 显然根据Apple Docs NSNull is Not(NSObject*)0但是是一个有效的实例. (3认同)
  • 实际上,`NSNull`是一个有效的对象.这就是我想说的.顺便说一句,Objective C中没有运算符重载.Objective C对象的比较只是指针比较. (2认同)

Ros*_*one 7

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

nil并且NULL100%可互换.

从:

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

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

但最终它们都被定义为同样的东西 - (void*)0,我认为 - 所以在实践中它并不重要.

  • 你是对的.[NSNull null]是一个单例值,用于表示禁止使用nil的情况下的nil值 - 例如在集合类中(如NSDictionary,NSArray,NSSet或mutable变体). (2认同)