【问题标题】:What are the differences between nil, NULL and [NSNULL nil]?nil、NULL 和 [NSNULL nil] 有什么区别?
【发布时间】:2011-07-25 09:59:33
【问题描述】:

我遇到了这样的错误 -

由于未捕获的异常“NSInvalidArgumentException”而终止应用程序,原因:-[NSCFDictionary initWithObjects:forKeys:count:]:尝试在 objects[0] (key: searched)'

然后我尝试了下面的代码

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 值?如果是,如何通常检查这些空值

谢谢:-)

【问题讨论】:

标签: iphone objective-c null invalidargumentexception


【解决方案1】:

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>

【讨论】:

    【解决方案2】:

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

    NSNull 类引用。

    您还可以在之前检查对象引用是否为nil,只需使用==

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

    【讨论】:

    • 感谢您的快速响应 :) 好的,我检查了“NSNull 类参考”。 nil 和 NULL 有区别吗?
    • @S.Philip - no nil 根据其定义,NULL 只是另一种说法
    • @S.Philip - 欢迎您。您可以在 Apple 的The Objective-C Programming Language 中找到有用的信息。
    【解决方案3】:

    Nil 用于对象指针

    NULL 用于非指针

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-02-18
      • 1970-01-01
      • 2015-07-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多