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

Web*_*Lai 25 null objective-c

正如标题所说NULL,nil和之间有什么区别@""

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

我应该使用哪种条件?

if ([dictionary objectForKey:@"aString"] == nil)
Run Code Online (Sandbox Code Playgroud)

要么

if [[dictionary objectForKey:@"aString"] isEqualToString:@""]
Run Code Online (Sandbox Code Playgroud)

要么

if ([dictionary objectForKey:@"aString"] == NULL)
Run Code Online (Sandbox Code Playgroud)

哪一个是对的?

Vla*_*mir 31

nil对于objective-c对象,它是NULL的模拟.实际上他们是一样的:

 //MacTypes.h
 #define nil NULL
Run Code Online (Sandbox Code Playgroud)

所以

if ([dictionary valueForKey:@"aString"]==nil)
if ([dictionary valueForKey:@"aString"]==NULL)
Run Code Online (Sandbox Code Playgroud)

两者都检查特定键是否存在于字典中,尽管第一行更正确,因为它检查objective-c类型.

关于:

if ([[dictionary valueForKey:@"aString"] isEqualToString:@""])
Run Code Online (Sandbox Code Playgroud)

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

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

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

if ([dictionary valueForKey:@"aString"]==nil ||
               [[dictionary valueForKey:@"aString"] isEqualToString:@""])
Run Code Online (Sandbox Code Playgroud)


NSR*_*der 19

nil == (id) 0
Nil == (Class) 0
NULL == (void *) 0
Run Code Online (Sandbox Code Playgroud)

@""是一个空的NSString常量.


Jay*_*kay 16

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

所有这些都恰好具有0的数值.它们都是零,但"NULL"是一个void*,"nil"是一个id,"Nil"是一个Class指针.

@""用于表示空字符串,或者表示长度为零的字符串.


gra*_*rks 5

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

这两个:

if ([dictionary valueForKey:@"aString"]==nil)
if ([dictionary valueForKey:@"aString"]==NULL)
Run Code Online (Sandbox Code Playgroud)

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

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

这个:

if ([[dictionary valueForKey:@"aString"] isEqualToString:@""])
Run Code Online (Sandbox Code Playgroud)

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