正如标题所说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"键的条目,并将该条目与空字符串进行比较.结果将是以下之一:
-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指针.
@""用于表示空字符串,或者表示长度为零的字符串.
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.
| 归档时间: |
|
| 查看次数: |
17670 次 |
| 最近记录: |