if (!json || json == (id)kCFNull) return nil;
在YYModel中看到这样一句,忽然发现自己对常见的空值有些模糊,于是记录下此文。
首先看一下它们的定义和用途
nil : Defines the id of a null instance 定义实例的空指针
Nil : Defines the id of a null class 定义类的空指针
NULL : 定义其他类型(基本数据类型、C类型、SEL)的空指针
dic = [NSJSONSerialization JSONObjectWithData:jsonData options:kNilOptions error:NULL];
char * q = NULL;
NSNull :
The NSNull class defines a singleton object used to represent null values in collection objects (which don’t allow nil values).
NSNull类定义了一个单例对象,用于表示集合对象(数组,字典等)中的空值(当某些情况不允许使用nil表示空)。可以通过下面2个例子看一下:
// 数组中nil是结束标志,所以数组中的空用[NSNull null] 表示
NSArray *Test = [NSArray arrayWithObjects:@"一万年太久", @"只争朝夕",[NSNull null],nil];
NSString *FallingWood = [Test objectAtIndex:2];
if ((NSNull *)FallingWood==[NSNull null]) {
NSLog(@"数组中的该元素是空");
}else {
NSLog(@"数组中的该元素非空");
}
// 字典中nil是结束标志,所以数组中的空用[NSNull null] 表示
NSDictionary *Test = [NSDictionary dictionaryWithObjectsAndKeys:[NSNull null],@"one",@"difang",@"two", nil];
NSString *FallingWood = [Test objectForKey:@"one"];
if ((NSNull *)FallingWood==[NSNull null]) {
NSLog(@"数组中的该元素是空";
}else {
NSLog(@"数组中的该元素非空");
}
kFCNull : const CFNullRef kCFNull; // the singleton null instance 是NSNull的单例
因为 NSNull与 CFNullRef 是 Toll-Free Bridging. 所以 NSNull 的类方法
+(NSNull *)null //返回值是一个单例子,与kFCNull 相等。
所以上面的2个例子可以改成:
if ((NSNull *)FallingWood== kCFNull) {
NSLog(@"数组中的该元素是空";
}else {
NSLog(@"数组中的该元素非空");
}
补充:
Toll-Free Bridging : 有一些数据类型能够同时在 Foundation Framework 和 Core Foundation Framework中使用。这意味着,对于同一个数据类型,你既可以将其作为参数传入 Core Foundation 函数,也可以将其作为接收者对其发送 Objective-C 消息(即调用ObjC类方法)。这种在 Core Foundation 和 Foundation 之间交换使用数据类型的技术就叫 Toll-Free Bridging.