Object-C中nil、Nil、NULL与NSNull的一些理解(文末元宵红包活动!)


小编有话说

细心的朋友可能已经注意到了,IOS学习之旅系列教程在本篇公众号的文章中,封面已经换成美女图片了,程序员的福利有木有!!!

这是亦枫将在公众号的IOS系列文章中采取的路线。看文章,学技术,眼睛累了马上点击大图看美女,这难道就是传说中的养眼吗!!!

看在小编这么走心的份上,也算是半个程序员鼓励师吧。学完技术记得分享哦,哪怕在文末点个????也是大大的支持啊!!!

记录一个菜鸟的IOS学习之旅,如能帮助正在学习的你,亦枫不胜荣幸;如遇路过的大神指导一番,亦枫感激涕淋!

相比于Java等其他编程语言,在空指针、空值上,iOS开发中所用到Object-C语言的使用较为复杂,有nil、Nil、NULL和NSNull多种情景可供使用,初学者很容易在它们之间产生混淆。

定义区别
  • nil
    指向OC中对象的空指针;

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

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

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

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

    NSURL *url = nil;
    Class class = Nil;
    int *pointerInt = NULL;
  2. 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、、three


NSObject *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

每日一图


上期技术

 iOS自定义单元格之xib文件



 

 

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值