[iOS]-nil、NULL、和NSNull的区别和使用

基本概念

nil用来给对象赋值(OC中的扔和对象都属于id类型)
NULL则给任何指针赋值,NULL和nil不能互换,nil用于类指针赋值(在OC中类是一个对象,是类的meta-class的实例)
NSNull则用于集合操作,它们虽然表示的都是空值,但使用的场合完全不同。

使用案例

id object = nil;
//判断对象不为空
if (object) {
	
}

//判断对象为空
if (object == nil) {
	
}

//数组初始化,空值结束
NSArray *array = [[NSArray alloc] initWithObjects:@"First", @"Second", @"Third", nil];

//判断数组元素是否为空
//注意下方取数组元素的下标的值不能越界,例如该例中的数组array的有效元素只有3个,所以element能取到的下标只有0~2,若取其他值程序就会崩溃
NSNull *element = [array objectAtIndex:2];
if (element == [NSNull null]) {
	NSLog(@"该元素为空!");
}

判断字典对象的元素是否为空:

NSDictionary *dictionary = [NSDictionary dictionaryWithObjectsAndKeys:@"iPhone", @"First", @"iPad", @"Second", nil];

NSNull *value = [dictionary objectForKey:@"First"];
if (value == [NSNull null]) {
	NSLog(@"该元素为空!");
}

总结:
nil:一般赋值给空对象
NULL:一般赋值给nil以外的其他空值,如SEL等
NSNull:NSNull中只有一个方法:+(NSNull *) null; [NSNull null]是一个单例对象,它用在不能使用nil的场合
使用场合:
当向nil发送消息时,返回NO,不会有异常,程序将继续执行下去,而向NSNull的对象发送消息时会收到异常。
如下:

NSArray *array = [[NSArray alloc] initWithObjects:@"123", [NSNull null], @"Second", nil];

NSArray *arrayFirst = [[NSArray alloc] initWithArray:array];
/*
下方输出:
(
    123,
    "<null>",
    Second
)
*/
NSLog(@"%@", arrayFirst);
    
NSArray *arraySecond = nil;
arraySecond = [arraySecond initWithArray:array];
//下方输出:(null)
NSLog(@"%@", arraySecond);
//而将nil改为[NSNull null]的话则程序会崩溃

由于在NSArray和NSDictonary中nil中有特殊的含义(表示列表结束),所以不能在集合中放入nil值,如果确实需要存储一个表示“什么都没有的值”,可以使用NSNull类。
例如:

//数组初始化,空值结束
NSArray *array = [[NSArray alloc] initWithObjects:@"123", [NSNull null], @"Second", nil];
//array[1]是[NSNull null]
//程序输出"<null>",正常运行而不会崩溃
NSLog(@"%@", array[1]);

//array[3]是nil
//程序会崩溃
NSLog(@"%@", array[3]);

小结:
从字面意思来理解,nil是一个对象,而NULL是一个值,我的理解为nil是将对象设置为空,而null是将基本类型设置为空的
就像下方的描述:

nil -> Null-pointer to objective- c object

NIL -> Null-pointer to objective- c class

null-> null pointer to primitive type or absence of data

具体的用法:

看一下用法
NSURL *url = nil;

Class  class = Nil;

int *pointerInt = NULL;

nil是一个对象指针为空,Nil是一个类指针为空,NULL是基本数据类型为空,这些可以理解为nil,Nil,NULL的区别
本博客学习自:大佬博客

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值