美文网首页iOS知识收录编程学习iOS 开发
Object-C中nil、Nil、NULL与NSNull的一些理

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

作者: 亦枫 | 来源:发表于2016-02-21 23:22 被阅读1626次

相比于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;
  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
}
  1. 常见判空处理:
//判断对象不空
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

相关文章

网友评论

  • RBNote:看了n篇, 还是这篇写的通俗易懂。
    我的理解: nil 有点像C语言的字符串结束标志 '\0' ,碰到这玩意就结束了
    NSNull :占个坑; 存在, 但是是空的


    有个建议:最后一段代码, 这个样判断更好
    if (![str isKindOfClass:[NSNull class]]) {
    NSLog(@"%@",str);
    }


    // 这样写会有很明显的警告,,
    if (str != [NSNull null]) {
    NSLog(@"%@",str);
    }
    RBNote: [[NSUserDefaults standardUserDefaults] setObject:nil forKey:@"Master"];
    试了一下, NSUserDefaults 存nil 居然不崩溃。
  • 36369a2a1ec8:谢谢分享
    亦枫:@高调的程序猿 :blush:
  • c09a3b25e5c1:写的很不错,有实际利用技巧,就比空洞的概念讲解好多了。
    亦枫:@ZGMF_X42S 谢谢,感兴趣关注一下我的微信公众号:技术鸟,交流学习👍
  • 幸福的李雨龙:都是主管臆断,官网文档多详细,英文好可以直接看不好的可以使用翻译
    亦枫:@幸福的李雨龙 一些理解,推荐阅读官方文档:+1:
  • 名扬丶四海:谢谢分享,学习了
    亦枫:@iOS_Country 荣幸之至!

本文标题:Object-C中nil、Nil、NULL与NSNull的一些理

本文链接:https://www.haomeiwen.com/subject/ktfbkttx.html