[swift、oc]浅聊nil、Nil、NULL、NSNull的区别

我们都知道nil、Nil、NULL、NSNull都表示为空但是究竟有什么区别,相信大家也很少关注。今天我们就浅聊一下这几个空的区别

一,区别:

1、nil

  nil一般是指把一个对象置空,既完全是一个空对象,完全从内存中释放。

2、Nil

  Nil和nil基本没有任何区别,也可以说只要是可以使用nil的地方都可以使用Nil,反之亦然。但是作为程序猿,我们应该更加严谨一些。nil和Nil的区别在于,nil表示置空一个对象,二Nil表示置空一个类。

3、NULL

  大家都知道oc 是基于c的,并且oc是完全兼容c的,NULL源于c,表示一个空指针.

⚠️:NULL 和 nil,没有实质区别,只不过前者是C语言只中的

  既:int *p  = NULL

4、NSNull

  NSNull很有意思,大家一般都会觉得,NSNull也是空,但是看着这货又是“NS”开头的很像一个对象,实质上NSNull的确是一个对象,他继承于NSObject。那它和nil的区别在哪里呢?nil是把一对象完全释放,就是完全从内存中释放。但是当我想把一个对象置空但是又想要一个容器的时候,我们就可以使用NSNull。比如一瓶矿泉水,我们不想要里面的水,但是我们想保留瓶子一样。看一下代码的区别.

⚠️:NSNULL是一个类,它代表空值,只有一个单例方法 [NSNull null]

二,举例:

Swift-举例:

//  定义一个数组

let mutableArray = NSMutableArray()

// 定义一个字典

let mutableDictionary = NSMutableDictionary()

// 定义NSNull

let null = NSNull()

// 添加到数组

mutableArray.addObject(null)

// 添加到字典

mutableDictionary.setObject(null, forKey: "null")

//***添加NSNull 程序运行很正常,因为 NSNull是一个类有内存地址的,所以添加到字典和数组都不会崩。下面是一下nil

// 添加nil到数组

mutableArray.addObject(nil)

// 添加nul到字典

mutableDictionary.setObject(nil, forKey: "nill")

//***直接报错,因为数组和字典里面存放的都是对象,对象都是有地址的。但是nil内存中没有地址,所以直接报错


下面是oc版本的,用oc的朋友可以参考一下:

- (void)viewDidLoad {

        [super viewDidLoad];

        NSMutableArray *mutableArray = [NSMutableArray array];

        NSMutableDictionary *mutableDictionary = [NSMutableDictionary dictionary];

      NSNull *null = [NSNull null];

        //  使用NSNull,不会报错会正常运行

        [mutableArray addObject:null];

        [mutableDictionary setObject:null forKey:@"null"];

         // 如果我们使用nil,没运行时回报警告,运行时程序会直接崩溃

       [mutableArray addObject:nil];

       [mutableDictionary setObject:nil forKey:@"nil"];

 nil用途:用于表示集合值为空的对象(oc中nil是不能存放在集合中的,因为nil是集合结束的标志位)

[objc] view plain copy

NSArray *arr = [NSArray arrayWithObjects:@"one",@"two",[NSNull null], nil nil];  

        for (NSString *str in arr) {  

            NSLog(@"%@",str);  

        }  

2015-10-06 16:40:25.816 test[96177:5565855] one  

2015-10-06 16:40:25.817 test[96177:5565855] two  

2015-10-06 16:40:25.817 test[96177:5565855]   

打印分两种:①%p打印地址;②%@打印对象的描述(字符串对象就是其本身)

三,swift 的null的处理:

描述:网络请求,获取json数据后,使用SwiftJSON转为model,遇到字段为null的情况(不为null是是个字符串值),可以如下处理:

创建一个NSNull类型的对象anyObject,该对象值为(空对象本身),然后将anyObject 转化为string类型,值变为nil,这样就可以将值为null的字段作为string类型(变为nil)与nil比较了。

/*

letanyObject:AnyObject=NSNull()

letanyStr = anyObjectas?String

print("anyObject:\(anyObject,anyStr)")

//打印结果:anyObject:(, nil)

*/

/*

letjsonValue:AnyObject=NSNull()

ifavatars![i]["url"].string== jsonValueas?String{

   tempCopyAvatarsArr?.remove(at: i)

}else{

   print("头像不为空!")

}

*/

四,总结:

标志                值                    含义

NULL       (void *)0            C指针的字面零值

nil               (id)0                    Objective-C对象的字面零值

Nil               (Class)0            Objective-C类的字面零值

NSNull       [NSNull null]    用来表示零值的单独的对象

总结:

         1. nil、NULL本质上是相同的,都指向0x0地址,[NSNULL null]是一个对象,存储在常量区,占用着固定地址。

         2.nil 表示一个指针指向的对象为空,这个对象的类型是id,显示出来是(null)--->常见于非集合类中

         3.[NSNull null] 表示空对象本身,显示出来是 -------------------------->常见于集合类中

         4.NULL 和 nil,没有实质区别,只不过前者是C语言的

参考链接:

http://www.cnblogs.com/wanglekai/p/5402816.html

http://blog.csdn.net/liyunxiangrxm/article/details/50402552#

你可能感兴趣的:([swift、oc]浅聊nil、Nil、NULL、NSNull的区别)