2011-07-25 40 views
8

我得到了这样的错误 - *终止应用程序由于未捕获的异常 'NSInvalidArgumentException',原因是:** - [NSCFDictionary initWithObjects:forKeys:数:]:尝试插入对象在[0](密钥零值:搜索)”nil,NULL和[NSNULL 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"]; 

我得到的NSLog消息为 'obj是零'。

但是,当我使用相同的上面的代码时,Obj是NSString和我的应用程序因为nil值终止,我得到NSLog消息为'Obj是(id)[NSNull null]'。

什么是零之间的区别,NULL和[NSNULL零]?

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

感谢:-)

+0

可能重复[iphone + nil,null和null之间的区别](http://stackoverflow.com/questions/5908936/iphonedifference-between-nil-nil-and- null) –

回答

19

NULL是给这被认为指向没有明确地址的指针原来的C风格的值。它通常只是用来表示“未设置”或作为sentinel value

char * oldstring = NULL; 

nil是同一事物的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 stringifies为(null),并NSNull<null>

+0

谢谢..... :) –

5

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

NSNull类参考。

如果对象引用nil简单地==您还可以检查之前。

另外nil定义为:#define nil NULL并且是CNULL的目标C当量。

+0

Thanx快速响应:)好吧,我检查了'NSNull类参考'。零和NULL是不同的? –

+0

@ S.Philip - no'nil'只是根据其定义说'NULL'的另一种方式 – 2011-07-25 10:10:53

+0

谢谢..... :) –

1

无为对象指针

NULL是用于非指针

[NSNULL空]为一个对象来表示“无”在零值的情况下要使用的不准(如通过指出文斯,就像在集合,如NSArray和NSDictionary)

+0

谢谢..... ..... :) –

相关问题