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

S.P*_*lip 8 iphone null objective-c invalidargumentexception

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

然后我尝试了下面的代码

    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"];
Run Code Online (Sandbox Code Playgroud)

我得到的NSLog消息是'Obj is nil'.

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

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

是否存在不同类型的Null值?如果是,如何检查这些空值

谢谢 :-)

Ben*_*tto 19

NULL是给指针的原始C样式值,该指针被认为指向没有明确的地址.它通常仅用于表示"未设置"或作为标记值.

char * oldstring = NULL;
Run Code Online (Sandbox Code Playgroud)

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

NSString * str = nil;
id foo = nil;
Run Code Online (Sandbox Code Playgroud)

它们都被定义为等于零值,虽然你可以互换使用它们,前者主要在Obj-C中用于传统指针(比如将void *上下文指针设置为NULL),nil并用于所有Obj-C对象引用.

存在差异是因为尽管Obj-C的语法恰好位于C语言之上,但语言的设计更高层次,其对象ID 在概念上与 "指针"不同.因此为他们创造了一个特殊的哨兵.

[NSNull null]是一个对象,其意图是在非常某些情况下使用(如插入到集合),其中一个"非值"值是理想的,但实际nil是不允许的,并且必须使用的对象.

需要注意的是nilNSNull字符串化非常相似:nilstringifies的(null),和NSNull作为<null>.


小智 5

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

NSNull类引用.

您还可以检查对象引用是否nil简单==.

nil被定义为:#define nil NULL和C的Objective C等价物NULL.