正如标题所说,NULL
,nil
和@""
之间有什么区别?
例如,如果我想检查字典中的字符串是空的。
我应该使用哪种条件?
if ([dictionary objectForKey:@"aString"] == nil)
或
if [[dictionary objectForKey:@"aString"] isEqualToString:@""]
或
if ([dictionary objectForKey:@"aString"] == NULL)
哪一个是对的?
答案 0 :(得分:31)
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”键的条目,并将该条目与空字符串进行比较。结果将是以下之一:
-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 表示不存在 @“”表示存在并且它是空的