HardBirch

Object-C中nil, NULL和NSNull 区别

时间:15-10-05 栏目:iOS移动应用开发技术 作者:魔豆先生 评论:0 点击: 1,681 次

因为Object-C的集合对象,如NSArray、NSDictionary、NSSet等,都有可能包含NSNull对象,所以,如果一下代码中的item为NSNull,则会引起程序崩溃。

 

[csharp] view plaincopy
  1. NSString *item=[NSArray objectAtIndex:i];
  2. if([item isEqualToString:@"TestNumber"])
  3. {
  4.     //
  5. }
  6. 以下代码是常见的错误,release对象没有设置为nil,从而引起程序崩溃。
  7. id someObject=[[Object alloc] init];
  8. //...
  9. [someObject release];
  10. //...
  11. if(someObject)
  12. {
  13.     //crash here
  14. }

nil用来给对象赋值(Object-C的任何对象都属于id类型),NULL则给任何指针赋值,NULL和nil不能互换,nil用于类指针赋值(在Object-C中类是一个对象,是类的meta-class的实例),而NSNull则用于集合操作,虽然它们表示的都是空值,但是使用场合完全不同,所以在编码时严格按照变量类型来赋值,将正确的空值赋给正确的类型,使代码易于阅读和维护,也不易引起错误。

 

 

[csharp] view plaincopy

  1. //判断对象不空
  2. if(object) {}
  3. //判断对象为空
  4. if(object == nil) {}
  5. //数组初始化,空值结束
  6. NSArray *pageNames=[[NSArray alloc] initWithObjects:@"DocumentList",@"AdvancedSearch",@"Statistics",nil];
  7. //判断数组元素是否为空
  8. UIViewController *controller=[NSArray objectAtIndex:i];
  9. if((NSNull *)controller == [NSNull null])
  10. {
  11.     //
  12. }
  13. //判断字典对象的元素是否为空
  14. NSString *userId=[NSDictionary objectForKey:@"UserId"];
  15. if(userId == [NSNull null])
  16. {
  17.     //
  18. }

Object-C有个可爱的特性,就是当发消息给nil对象时,系统返回0值而不是引起异常,这和JAVA烦人的NullPointerException以及C/C++的程序直接崩溃的处理完全不一样,明白Object-C的这个特性对于开发正确的IOS程序非常重要,因为nil是对象的合法值,nil对象同样可以接收消息,例如:

 

 

[csharp] view plaincopy
  1. person=nil;
  2. [person castBallot];
  3. NSLog("person=%@",person);

对象置空,然后发送消息,程序同样接着往下执行而不会崩溃。

声明: 本文由( 魔豆先生 )原创编译,转载请保留链接: Object-C中nil, NULL和NSNull 区别

Object-C中nil, NULL和NSNull 区别:等您坐沙发呢!

发表评论


QQ群互动

Linux系统与内核学习群:194051772

WP建站技术学习交流群:194062106

魔豆之路QR

魔豆的Linux内核之路

魔豆的Linux内核之路

优秀工程师当看优秀书籍

优秀程序员,要看优秀书!

赞助商广告

友荐云推荐