前言
在工作当中我们在调用官方的api的时候,有时候一个参数即可以写成nil
,而写成NULL
也不会报错。也是一直没有搞明白为什么。然后通过查阅资料,发现原来除了nil
,NULL
,还有Nil
,NSNull
,是不是感觉很晕,我也是懵逼了。于是做一下笔记记录一下。
nil
我们给对象赋值时一般都会使用object = nil
,表示我想把这个对象释放掉;
或者对象由于某种原因,经过多次release,于是对象引用计数为0了,系统将这块内存释放掉,这个时候这个对象为nil,我们称它为“空对象”。(**注意:这里强调的是“空对象”,下面我会拿它和“值为空的对象”做对比!**)
所以对于这种空对象,所有关于retain的操作都会引起程序crash(注意:我是说关于retain操作,而向一个nil对象发送消息是不会crash的),例如字典添加键值或者数组添加新元素等,具体可以参考如下代码:
- (void)viewDidLoad {
[super viewDidLoad];
NSMutableArray *mArr = [[NSMutableArray alloc] init];
NSMutableDictionary *mDic = [[NSMutableDictionary alloc] init];
// 以下用法不会引起crash
// id object = [[NSObject alloc] init];
// [mArr addObject:object];
// [mDic setObject:object forKey:@"objectKey"];
// 以下用法会导致crash
id obj = nil;
[mArr addObject:obj];
[mDic setObject:obj forKey:@"objKey"];
}
NSNull
NSNull
和nil
的区别在于nil
是一个空对象,已经完全从内存中消失了,而如果我们想表达“我们需要有这样一个容器,但是这个容器里面什么也没有”的时候,我们就要用到NSNull
,我称它为”值为空的对象”。如果你查阅开发文档你会发现NSNull
这个类是继承NSObject
,并且只有一个+ (NSNull *) null;
类方法。这就说明NSNull
对象拥有一个有效的内存地址,所以在程序中对它的任何引用都是不会导致程序崩溃的。参考代码如下:
- (void)viewDidLoad {
[super viewDidLoad];
NSMutableArray *mArr = [[NSMutableArray alloc] init];
NSMutableDictionary *mDic = [[NSMutableDictionary alloc] init];
id obj = nil;
if (obj == nil) {
obj = [NSNull null];
}
[mArr addObject:obj];
[mDic setObject:obj forKey:@"objKey"];
NSLog(@"%@--%@",[mArr firstObject],mDic[@"objKey"]);
}
Nil
Nil
和nil
在使用上没有严格规定的,也就是说凡是使用nil
的地方都可以使用Nil
来代替,反之亦然。只不过从编程命名规范来说,我们约定俗成地将Nil
表示成一个空类,nil
表示一个空对象。参考代码如下:
- (void)viewDidLoad {
[super viewDidLoad];
id obj = nil;
if (obj == nil) {
NSLog(@"obj is nil");
}
Class classA = Nil;
if (classA == Nil) {
NSLog(@"classA is Nil");
}
}
NULL
我们知道Object-C
来源于C、支持C,当然也有别于C,而NULL
就是典型C语言的语法,它表示一个空指针,参考代码如下:
NSInteger *point = NULL;
最后更新: 2023年12月03日 19:30:24
本文链接: http://example.com/post/937a3ecd.html
版权声明: 本作品采用 CC BY-NC-SA 4.0 许可协议进行许可,转载请注明出处!