nil是一个与对象绑定/对应的空值(Objective-C 中的 id 类型)。nil没有参考/地址,只是一个空值。
NSString *str = nil;
因此,如果我们正在处理一个对象,则应该使用 nil。
if(str==nil)
NSLog("str is empty");
现在NULL用于Objective-C 中的非对象指针(如 C 指针)。像nil一样,NULL没有值也没有地址。
char *myChar = NULL;
struct MyStruct *dStruct = NULL;
因此,如果有一种情况,当我需要检查我的结构(结构类型变量)是否为空时,我将使用:
if (dStruct == NULL)
NSLog("The struct is empty");
我们再举一个例子,
- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context
键值观察的上下文应该是 C 指针或对象引用。这里的上下文我们不能使用nil;我们必须使用NULL。
最后,NSNull类定义了一个单例对象,用于表示集合对象(NSArray,NSDictionary)中的空值。[NSNull null]将返回 NSNull的单例实例。基本上[NSNull null]是一个合适的对象。
无法将 nil 对象插入到集合类型对象中。让我们举个例子:
NSMutableArray *check = [[NSMutableArray alloc] init];
[check addObject:[NSNull null]];
[check addObject:nil];
在第二行,我们不会得到任何错误,因为将 NSNull 对象插入到集合类型对象中是完全公平的。在第三行,我们会得到“object cannot be nil”错误。因为 nil 不是对象。