基本概念
nil用来给对象赋值(OC中的扔和对象都属于id类型)
NULL则给任何指针赋值,NULL和nil不能互换,nil用于类指针赋值(在OC中类是一个对象,是类的meta-class的实例)
NSNull则用于集合操作,它们虽然表示的都是空值,但使用的场合完全不同。
使用案例
id object = nil;
//判断对象不为空
if (object) {
}
//判断对象为空
if (object == nil) {
}
//数组初始化,空值结束
NSArray *array = [[NSArray alloc] initWithObjects:@"First", @"Second", @"Third", nil];
//判断数组元素是否为空
//注意下方取数组元素的下标的值不能越界,例如该例中的数组array的有效元素只有3个,所以element能取到的下标只有0~2,若取其他值程序就会崩溃
NSNull *element = [array objectAtIndex:2];
if (element == [NSNull null]) {
NSLog(@"该元素为空!");
}
判断字典对象的元素是否为空:
NSDictionary *dictionary = [NSDictionary dictionaryWithObjectsAndKeys:@"iPhone", @"First", @"iPad", @"Second", nil];
NSNull *value = [dictionary objectForKey:@"First"];
if (value == [NSNull null]) {
NSLog(@"该元素为空!");
}
总结:
nil:一般赋值给空对象
NULL:一般赋值给nil以外的其他空值,如SEL等
NSNull:NSNull中只有一个方法:+(NSNull *) null;
[NSNull null]
是一个单例对象,它用在不能使用nil的场合
使用场合:
当向nil发送消息时,返回NO,不会有异常,程序将继续执行下去,而向NSNull的对象发送消息时会收到异常。
如下:
NSArray *array = [[NSArray alloc] initWithObjects:@"123", [NSNull null], @"Second", nil];
NSArray *arrayFirst = [[NSArray alloc] initWithArray:array];
/*
下方输出:
(
123,
"<null>",
Second
)
*/
NSLog(@"%@", arrayFirst);
NSArray *arraySecond = nil;
arraySecond = [arraySecond initWithArray:array];
//下方输出:(null)
NSLog(@"%@", arraySecond);
//而将nil改为[NSNull null]的话则程序会崩溃
由于在NSArray和NSDictonary中nil中有特殊的含义(表示列表结束),所以不能在集合中放入nil值,如果确实需要存储一个表示“什么都没有的值”,可以使用NSNull类。
例如:
//数组初始化,空值结束
NSArray *array = [[NSArray alloc] initWithObjects:@"123", [NSNull null], @"Second", nil];
//array[1]是[NSNull null]
//程序输出"<null>",正常运行而不会崩溃
NSLog(@"%@", array[1]);
//array[3]是nil
//程序会崩溃
NSLog(@"%@", array[3]);
小结:
从字面意思来理解,nil是一个对象,而NULL是一个值,我的理解为nil是将对象设置为空,而null是将基本类型设置为空的
就像下方的描述:
nil -> Null-pointer to objective- c object
NIL -> Null-pointer to objective- c class
null-> null pointer to primitive type or absence of data
具体的用法:
看一下用法
NSURL *url = nil;
Class class = Nil;
int *pointerInt = NULL;
nil是一个对象指针为空,Nil是一个类指针为空,NULL是基本数据类型为空,这些可以理解为nil,Nil,NULL的区别
本博客学习自:大佬博客