Object-C之(Null)与(Bool)

在写iOS程序的时候,想初始化一个空值的时候,经常会迷茫到底是用nil,null还是NSNull, 想定义一个布尔值的变量时,又需要去想想应该用bool,BOOL抑或Boolean,赋值的时候应应该给YES/NO还是true/false。今天正好来理一下。 

nil/Nil/NULL/NSNull 

Matt Thompson总结了这4个变量的不同之处: 
SymbolValueMeaning
NULL(void *)0literal null value for C pointers
nil(id)0literal null value for Objective-C objects
Nil(Class)0literal null value for Objective-C classes
NSNull[NSNull null]singleton object used to represent null


NULL是C语言中用来指代一个空指针的,Object-C是C语言的超集,可以使用C语言中特性,因此当你处于C语言语义下的时候应该使用NULL。比方说初始化一个结构体等 
Obj-c代码   收藏代码
  1. struct MyStruct *dStruct = NULL;  


nil指代的是一个指向空的对象指针,因此当你初始化一个对象为空的时候,应该使用nil,另外,在java中,如果你去调用空对象的方法时,会抛出NullPointerException,在obj-c中,会返回0。因此,在obj-c中,通常情况下是不需要去做空对象判断的。即: 

Obj-c代码   收藏代码
  1. if (obj !=nil && [obj isPass]) {  
  2.     //do something  
  3. }  
完全可以简化为 

    if ([obj isPass]) { 
        //do something 
    } 
    
Nil指代的是一个指向空的类指针,用的情况很少,当期望返回值为一个类的时候,空值应该使用Nil。 

NSNull提供了一个类方法来生成一个单例的空对象, 这个类是由Foundation框架引入的,主要是为了绕过Obj-c中的集合类,NSArray,NSDictionary等不能放nil值的约束的。可以把其看做是一个可以用于集合类的nil的封装。 
Obj-c代码   收藏代码
  1. NSMutableDictionary *mutableDictionary = [NSMutableDictionary dictionary];  
  2. mutableDictionary[@"Key-1"] = [NSNull null];   
  3. NSLog(@"Keys: %@", [mutableDictionary allKeys]);  


BOOL/bool/Boolean/NSCFBoolean 
Matt Thompson对这几个变量的不同之处的归纳如下: 
NameTypedefHeaderTrue ValueFalse Value
BOOLsigned charobjc.hYESNO
bool _Bool(int)stdbool.htruefalse
Booleanunsigned charMacTypes.hTRUEFALSE
CFBooleanRefstructCoreFoundation.hkCFBooleanTruekCFBooleanFalse


简单来说,在Obj-C中,都应该使用BOOL,然后使用YES和NO。这会帮你避免很多头疼的问题,当你遇到问题的时候,比方说这个问题: http://blog.bignerdranch.com/564-bools-sharp-corners/。 
你可以通过上表中的差别,来定位问题。 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值