文档章节

Object-C中nil、Nil、NULL与NSNull的一些理解

张向坤
 张向坤
发布于 2016/02/23 14:54
字数 709
阅读 8
收藏 0

定义区别

  • nil
    指向OC中对象的空指针;

  • Nil
    指向OC中类的空指针;

  • NULL
    指向变量类型的空指针;

  • NSNull
    在集合对象中,表示空值的对象;

使用小结

从字面意义上理解,nil是一个对象,而NULL是一个值,所以在调用对象方法时:[nil 任意方法] 返回NO,不会出现问题,这与Java等语言中经典的NullPointerException空值异常大相径庭;[NSNull 任意方法] 抛出异常甚至导致崩溃。

常见用法:

NSURL *url = nil;
Class class = Nil;int *pointerInt = NULL;
  1. NSNULL,NULL和nil在本质上应该是一样的,NULL和nil其实就是0,但是在Objective-c中,对于像NSArray这样的 类型,nil或NULL不能做为加到其中的Object,如果定义了一个NSArray,为其分配了内存,又想设置其中的内容为空,则可以用 [NSNULL null返回的对对象来初始化NSArray中的内容。因为在集合对象如NSArray和NSDictionary中nil中有特殊的含义(表示列表结 束),所以不能在集合中放入nil值。如要确实需要存储一个表示“什么都没有”的值,可以使用NSNull类,能起到占位符的作用。NSNull只有一个 方法:

    + (NSNull *) null;

常见案例

  1. 下面一段代码是常见的错误,release对象没有设置为nil,从而引起程序崩溃:

    id someObject=[[Object alloc] init]; //...[someObject release]; //...if(someObject){ 
     //crash here}
  2. 常见判空处理:

    //判断对象不空if(object) {}//判断对象为空if(object == nil) {}//数组初始化,空值结束NSArray *pageNames=[[NSArray alloc] initWithObjects:@"DocumentList",@"AdvancedSearch",@"Statistics",nil];//判断数组元素是否为空UIViewController *controller=[NSArray objectAtIndex:i];if((NSNull *)controller == [NSNull null]){ 
         //}//判断字典对象的元素是否为空NSString *userId=[NSDictionary objectForKey:@"UserId"];if(userId == [NSNull null]){ 
         //}

最后通过集合对象中占位符来加深一下理解:

NSObject *obj1 = [[NSObject alloc] init];NSObject *obj2 = [NSNull null];NSObject *obj3 = [NSObject
 **new
**];NSObject *obj4;NSArray *arr1 = [NSArray arrayWithObjects:obj1, obj2, obj3, obj4, nil];NSLog(@"arr1 count: %ld", [arr1 count]); //count: 3 因为obj=nil,在加入obj4时就结束添加对象NSObject *obj1;NSObject *obj2 = [[NSObject alloc] init];NSObject *obj3 = [NSNull null];NSObject *obj4 = [NSObject
 **new
**];NSArray *arr2 = [NSArray arrayWithObjects:obj1, obj2, obj3, obj4, nil];NSLog(@"arr2 count: %ld", [arr2 count]); //count: 0,因为obj1=nil,所以后面的对象没有添加进去[NSNull null]通常作为占位符作用,如下:NSObject *obj1 = [NSNull null];NSArray *arr1 = [NSArray arrayWithObjects:@"One", @"TWO", obj1,@"three",nil];

**for** (NSString *str in arr1) {NSLog(@"array object: %@", str);

} //result:One、Two、、threeNSObject *obj1 = [NSNull null];NSArray *arr1 = [NSArray arrayWithObjects:@"One", @"TWO", obj1,@"three",nil];

**for** (NSString *str in arr1) {

**if** (str != [NSNull null]){NSLog(@"array object: %@", str);

}

}//result:One、Two、three


© 著作权归作者所有

张向坤
粉丝 0
博文 27
码字总数 44036
作品 0
朝阳
项目经理
私信 提问
iOS nil、Nil、NULL和NSNull 的使用

nil用来给对象赋值(Objective-C中的任何对象都属于id类型),NULL则给任何指针赋值,NULL和nil不能互换,nil用于类指针赋值(在Objective-C中类是一个对象,是类的meta-class的实例),而N...

江山风雨
2018/07/04
0
0
ios nil、NULL和NSNull 的使用

nil用来给对象赋值(Objective-C中的任何对象都属于id类型),NULL则给任何指针赋值,NULL和nil不能互换,nil用于类指针赋值(在Objective-C中类是一个对象,是类的meta-class的实例),而N...

Align
2016/01/04
13
0
Nil,nil,NSNULL,NULL的区别

一、nil 我们给对象赋值时一般会使用object = nil,表示我想把这个对象释放掉; 或者对象由于某种原因,经过多次release,于是对象引用计数器为0了,系统将这块内存释放掉,这个时候这个对象...

sirier
2014/09/28
0
0
nil,NULL,NSNull的区别

nil,NULL,NSNull的区别 主要就以下几点: 1、nil:一般赋值给空对象; 2、NULL:一般赋值给nil之外的其他空值。如SEL等;   举个栗子(好重啊~):     [NSApp beginSheet:sheet    ...

Daniel_s
2015/12/25
25
0
​Object-C nil NULL 和 NSNull

nil 用来给对象赋值 NULL 则给任何指针赋值 //NULL 和 nil 不能互换,nil 用于类指针赋值 NSNull 则用于集合操作 一般情况下最好使用用 nil (空对象值,有意义) [ nil 任意方法],不会导致崩溃...

Jack088
2015/09/18
72
0

没有更多内容

加载失败,请刷新页面

加载更多

基础工具类

package com.atguigu.util;import java.sql.Connection;import java.sql.SQLException;import java.util.Properties;import javax.sql.DataSource;import com.alibaba.druid......

architect刘源源
今天
42
0
P30 Pro劲敌!DxO官宣新机:排行榜又要变

5月26日晚间,DxOMark官方推特预告,将在5月27日公布一款新机型的DxOMark评分,猜猜是哪款? 网友猜想的机型有:红米K20、谷歌Pixel 3a、索尼Xperia 1、诺基亚9 PureView等。 DxOMark即将公布...

linux-tao
昨天
15
0
Ubuntu18.04.2窗口过小不能自适应(二次转载)

解决Ubuntu在虚拟机窗口不能自适应 2018年09月06日 16:20:08 起不了名儿 阅读数 855 此博文转载:https://blog.csdn.net/nuddlle/article/details/77994080(原地址) 试了很多办法这个好用 ...

tahiti_aa
昨天
2
0
死磕 java同步系列之CountDownLatch源码解析

问题 (1)CountDownLatch是什么? (2)CountDownLatch具有哪些特性? (3)CountDownLatch通常运用在什么场景中? (4)CountDownLatch的初始次数是否可以调整? 简介 CountDownLatch,可以...

彤哥读源码
昨天
6
0
Nginx提供下载apk服务

有时候我们可能需要提供文件或者其他apk下载链接,通过 nginx 配置可以很简单地实现。 server {    listen 80;    server_name download.xxx.com;    root app;    locati...

Jack088
昨天
4
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部