8

我收到这样的错误 -

由于未捕获的异常“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"];

我收到 NSLog 消息为“Obj is nil”。

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

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

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

谢谢 :-)

4

3 回答 3

19

NULL是赋予指针的原始 C 风格值,该指针被认为指向没有明确的地址。它通常仅用于表示“未设置”或作为哨兵值

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在概念上与“指针”不同。因此,为他们创建了一个特殊的哨兵。

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

注意nilNSNullstringify 非常相似:nilstringify as(null)NSNullas <null>

于 2011-07-25T10:05:14.847 回答
5

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

NSNull类引用。

您还可以在之前检查对象引用是否nil只是 with ==

nil被定义为 :#define nil NULL并且是 C 的 Objective C 等价物NULL

于 2011-07-25T10:02:16.760 回答
1

Nil 用于对象指针

NULL 用于非指针

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

于 2011-07-25T10:06:29.870 回答