nil,NULL和[NSNULL nil]之间有什么区别?

时间:2011-07-25 09:59:34

标签: iphone objective-c null invalidargumentexception

我收到了这样的错误 - *因未捕获的异常而终止应用程序'NSInvalidArgumentException',原因:** - [NSCFDictionary initWithObjects:forKeys:count:]:尝试在对象[0]处插入nil值( key:search)'

然后我尝试了下面的代码

    if (Obj == (id)[NSNull null])  //Obj is an id 
{
    NSLog(@" Obj is (id)[NSNull null]");    
}
else if (Obj == nil)
{
    NSLog(@"Obj is nil");   
} 
else if (Obj == NULL)
{
    NSLog(@"Obj is NULL");  
} 
else
{
    NSLog(@"Obj is something else");
}

searchedDict = [NSDictionary dictionaryWithObject:Obj forKey:@"searched"];

我得到的NSLog消息为'Obj is nil'。

但是当我使用相同的上述代码时Obj是NSString并且我的应用程序由于nil值而被终止,我得到了NSLog消息为'Obj is(id)[NSNull null]'。

nil,NULL和[NSNULL nil]之间有什么区别?

是否有不同类型的Null值?如果是,如何通常检查这些空值

谢谢: - )

3 个答案:

答案 0 :(得分:19)

NULL是指向指针的原始C样式值,该指针被认为指向没有显式地址。它通常仅用于表示“未设置”或表示sentinel value

char * oldstring = NULL;

nil是与Obj-C对象引用相同的Objective-C版本:

NSString * str = nil;
id foo = nil;

它们都被定义为等于零值,虽然可以交替使用它们,但前者主要在Obj-C中用于传统指针(如设置void *上下文指针指向NULL)和nil用于所有Obj-C对象引用。

存在差异是因为尽管Obj-C的语法恰好位于C语言之上,但语言的设计更高层次,其对象ID aren't conceptually the same仅仅是“指针”。因此为他们创造了一个特殊的哨兵。

[NSNull null]是一个对象that is intended,可以在非常特定的情况下使用(例如插入集合),其中需要“非值”值,但不允许实际nil ,必须使用一个对象。

请注意,nilNSNull字符串非常相似:nil字符串为(null)NSNull字符串为<null>

答案 1 :(得分:5)

[NSNull null]是要在集合中插入的nil值的包装器,如果它是您想要的。

NSNull课程参考。

您也可以使用nil检查对象引用是否为==

此外,nil定义为:#define nil NULL,与C NULL的目标C等价。

答案 2 :(得分:1)

Nil用于对象指针

NULL用于非指针

[NSNULL null]是一个表示“nil”的对象,用于不允许nil值的情况(正如Vince所指出的那样,例如在集合中,例如NSArray和NSDictionary)