在写iOS程序的时候,想初始化一个空值的时候,经常会迷茫到底是用nil,null还是NSNull, 想定义一个布尔值的变量时,又需要去想想应该用bool,BOOL抑或Boolean,赋值的时候应应该给YES/NO还是true/false。今天正好来理一下。
[size=large][b]nil/Nil/NULL/NSNull[/b][/size]
Matt Thompson总结了这4个变量的不同之处:
[table]
|Symbol| Value| Meaning|
|NULL| (void *)0| literal null value for C pointers|
|nil| (id)0 | literal null value for Objective-C objects|
|Nil| (Class)0| literal null value for Objective-C classes|
|NSNull| [NSNull null]| singleton object used to represent null|
[/table]
NULL是C语言中用来指代一个空指针的,Object-C是C语言的超集,可以使用C语言中特性,因此当你处于C语言语义下的时候应该使用NULL。比方说初始化一个结构体等
nil指代的是一个指向空的对象指针,因此当你初始化一个对象为空的时候,应该使用nil,另外,在java中,如果你去调用空对象的方法时,会抛出NullPointerException,在obj-c中,会返回0。因此,在obj-c中,通常情况下是不需要去做空对象判断的。即:
if ([obj isPass]) {
//do something
}
Nil指代的是一个指向空的类指针,用的情况很少,当期望返回值为一个类的时候,空值应该使用Nil。
NSNull提供了一个类方法来生成一个单例的空对象, 这个类是由Foundation框架引入的,主要是为了绕过Obj-c中的集合类,NSArray,NSDictionary等不能放nil值的约束的。可以把其看做是一个可以用于集合类的nil的封装。
[size=large][b]BOOL/bool/Boolean/NSCFBoolean[/b][/size]
Matt Thompson对这几个变量的不同之处的归纳如下:
[table]
|Name| Typedef| Header| True Value| False Value|
|BOOL| signed char| objc.h| YES| NO|
|bool _Bool| (int)| stdbool.h |true |false|
|Boolean| unsigned char| MacTypes.h| TRUE| FALSE|
|CFBooleanRef| struct| CoreFoundation.h| kCFBooleanTrue| kCFBooleanFalse|
[/table]
简单来说,在Obj-C中,都应该使用BOOL,然后使用YES和NO。这会帮你避免很多头疼的问题,当你遇到问题的时候,比方说这个问题:[url]http://blog.bignerdranch.com/564-bools-sharp-corners/[/url]。
你可以通过上表中的差别,来定位问题。
[size=large][b]nil/Nil/NULL/NSNull[/b][/size]
Matt Thompson总结了这4个变量的不同之处:
[table]
|Symbol| Value| Meaning|
|NULL| (void *)0| literal null value for C pointers|
|nil| (id)0 | literal null value for Objective-C objects|
|Nil| (Class)0| literal null value for Objective-C classes|
|NSNull| [NSNull null]| singleton object used to represent null|
[/table]
NULL是C语言中用来指代一个空指针的,Object-C是C语言的超集,可以使用C语言中特性,因此当你处于C语言语义下的时候应该使用NULL。比方说初始化一个结构体等
struct MyStruct *dStruct = NULL;
nil指代的是一个指向空的对象指针,因此当你初始化一个对象为空的时候,应该使用nil,另外,在java中,如果你去调用空对象的方法时,会抛出NullPointerException,在obj-c中,会返回0。因此,在obj-c中,通常情况下是不需要去做空对象判断的。即:
if (obj !=nil && [obj isPass]) {
//do something
}
完全可以简化为
if ([obj isPass]) {
//do something
}
Nil指代的是一个指向空的类指针,用的情况很少,当期望返回值为一个类的时候,空值应该使用Nil。
NSNull提供了一个类方法来生成一个单例的空对象, 这个类是由Foundation框架引入的,主要是为了绕过Obj-c中的集合类,NSArray,NSDictionary等不能放nil值的约束的。可以把其看做是一个可以用于集合类的nil的封装。
NSMutableDictionary *mutableDictionary = [NSMutableDictionary dictionary];
mutableDictionary[@"Key-1"] = [NSNull null];
NSLog(@"Keys: %@", [mutableDictionary allKeys]);
[size=large][b]BOOL/bool/Boolean/NSCFBoolean[/b][/size]
Matt Thompson对这几个变量的不同之处的归纳如下:
[table]
|Name| Typedef| Header| True Value| False Value|
|BOOL| signed char| objc.h| YES| NO|
|bool _Bool| (int)| stdbool.h |true |false|
|Boolean| unsigned char| MacTypes.h| TRUE| FALSE|
|CFBooleanRef| struct| CoreFoundation.h| kCFBooleanTrue| kCFBooleanFalse|
[/table]
简单来说,在Obj-C中,都应该使用BOOL,然后使用YES和NO。这会帮你避免很多头疼的问题,当你遇到问题的时候,比方说这个问题:[url]http://blog.bignerdranch.com/564-bools-sharp-corners/[/url]。
你可以通过上表中的差别,来定位问题。