Objective-C:NULL,nil和@“”之间有什么区别?

时间:2010-11-26 08:39:31

标签: objective-c null

正如标题所说,NULLnil@""之间有什么区别?

例如,如果我想检查字典中的字符串是空的。

我应该使用哪种条件?

if ([dictionary objectForKey:@"aString"] == nil)

if [[dictionary objectForKey:@"aString"] isEqualToString:@""]

if ([dictionary objectForKey:@"aString"] == NULL)

哪一个是对的?

6 个答案:

答案 0 :(得分:31)

对于objective-c对象,

nil是NULL的模拟。实际上他们是一样的:

 //MacTypes.h
 #define nil NULL

所以

if ([dictionary valueForKey:@"aString"]==nil)
if ([dictionary valueForKey:@"aString"]==NULL)

检查特定键是否存在于字典中,尽管第1行更正确,因为它检查了objective-c类型。

关于:

if ([[dictionary valueForKey:@"aString"] isEqualToString:@""])

此行检查字典中是否有带“aString”键的条目,并将该条目与空字符串进行比较。结果将是以下之一:

    如果您的密钥没有此类条目,则
  • 为false
  • 如果您的密钥有条目且该条目为空字符串,则
  • 为true 如果您的密钥的对象存在且未响应-isEqualToString:消息
  • ,则
  • 可能会崩溃

因此,根据您的需要,您必须使用第1行,或者如果您需要同时检查条目是否存在且它不是空字符串,那么您需要2个条件:

if ([dictionary valueForKey:@"aString"]==nil ||
               [[dictionary valueForKey:@"aString"] isEqualToString:@""])

答案 1 :(得分:19)

nil == (id) 0
Nil == (Class) 0
NULL == (void *) 0

@“”是一个空的NSString常量。

答案 2 :(得分:16)

nil 用于表示指向Objective-C对象的空指针。 Nil 用于表示指向Objective-C类的空指针。 NULL 用于表示指向其他任何内容的空指针。

所有这些,碰巧的数值为0.它们都是零,但“NULL”是一个void *,“nil”是一个id,“Nil”是一个Class指针。

@“”用于表示空字符串,或者说长度为零的字符串。

答案 3 :(得分:5)

valueForKey:(以及大多数其他Cocoa方法)向对象返回一个指针(内存地址)。当您使用==符号时,您只需测试该指针的数值,而不是字符串的实际值。当您使用isEqualToString:时,您正在测试该值。

这两个:

if ([dictionary valueForKey:@"aString"]==nil)
if ([dictionary valueForKey:@"aString"]==NULL)

或多或少是等价的并且都测试“返回的地址是否等于零?”,这就是valueForKey:表示没有找到该密钥的对象的方式。如果字典确实包含该键的任何对象,则无论其值如何(例如,即使是空字符串),此if语句也会返回false。

(您通常使用Objective-C中的nil版本作为样式约定,与其他任何内容一样)

此:

if ([[dictionary valueForKey:@"aString"] isEqualToString:@""])

测试字符串的实际值以查看它是否为零长度字符串。如果字典中没有对象,它将返回false,因为当你针对isEqualToString:指针调用nil(或几乎任何其他方法)时,你总是得到零或错误。

答案 4 :(得分:1)

“NSNull类定义了一个单例对象,用于在禁止nil作为值的情况下(通常在集合对象(如数组或字典)中)表示空值。”您可以在任何可以使用null的地方使用nil。主要区别在于您可以将消息发送到nil,因此您可以在无法工作的某些地方使用它。一般来说,只需使用零。这正是发生的事情,程序员选择将一个空对象放入控制器数组中,其中nil不允许作为值。

它更像是一个上下文引用,其中NULL是指向0x0的指针,nil是一个不存在的objective-c对象,Nil是一个不存在的objective-c类,但从技术上讲它们都只是0.此外,它是NULL不为null - null在Java或C#中,但不在Objective-C

或缓解你说的方式

它们全部为零,但“NULL”为空*,“nil”为id,“Nil”为类指针。

答案 5 :(得分:0)

Nil NULL 表示不存在 @“”表示存在并且它是空的