IOS中的空值介绍 nil Nil NULL NSNull KFCNull

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.

你可能感兴趣的:(IOS中的空值介绍 nil Nil NULL NSNull KFCNull)