Objective-C nil 崩溃探讨

nil 是一个合法的 id类型的 OC对象,所以对nil 发送消息是完全可以的,比如我们这样写

《Objective-C nil 崩溃探讨》

在任意一个 控制器viewDidLoad 里面这样写 不会导致崩溃,

《Objective-C nil 崩溃探讨》

打断点之后我们打印obj 的值

《Objective-C nil 崩溃探讨》

此时为 nil,也就是说nil 的objectforkey 也是nil,有人会问这一个方法objectforkey不能说明对nil发送其他消息不会崩溃啊。很好的想法,我们继续:对一个为nil 的NSArray 发消息:

《Objective-C nil 崩溃探讨》

结果

《Objective-C nil 崩溃探讨》

《Objective-C nil 崩溃探讨》

得到同样的结论:对值为nil 的对象发消息,不会导致崩溃。那么,如果对nil取属性呢?这种情况在我们使用model 的时候经常遇到。一个继承自Object 的对象,他有一个属性为  @property (nonatomic, strong)—- *property;如果这个对象为nil,那对其进行获取属性操作会不会 崩溃呢?我来试试

《Objective-C nil 崩溃探讨》

《Objective-C nil 崩溃探讨》

程序仍然平稳运行,没有崩溃。

《Objective-C nil 崩溃探讨》

那我们经常遇到的关于nil的崩溃都是怎么回事 ?好吧我们再来看看。

《Objective-C nil 崩溃探讨》

这一回崩溃了,原因是我们给字典的值不能附nil。数组也是一样的,数组的元素也不能为nil。

《Objective-C nil 崩溃探讨》
这样写同样会崩溃


接下来我们看看,数组越界的情况,刚才我们已经讨论过向为nil 的数组发消息不会崩溃。现在我们来看看数组为不为nil 的情况。

《Objective-C nil 崩溃探讨》 数组是个空数组

出乎意料的没有崩溃,而得到的obj 为nil。

《Objective-C nil 崩溃探讨》

但是这样写就不行了

《Objective-C nil 崩溃探讨》

立马就崩溃了。我们来看一看原因,对于firstObject  Apple 的描述是

《Objective-C nil 崩溃探讨》

数组为空返回nil;对于objectAtIndex Apple 的描述是 

《Objective-C nil 崩溃探讨》

那我们试试 objectAtIndex:0 

《Objective-C nil 崩溃探讨》

同样是崩溃,这就看出来差别了,firstObject 其实就是 objectAtindex:0。但是firstObject对数组进行了是否为空的判断,而 objectAtindex 没有。所以导致一个不会崩溃,一个会崩溃。这是在OC中,那么到swift里面会是什么样呢?请留意后续探讨。

    原文作者:悟_空
    原文地址: https://www.jianshu.com/p/03c0c441e371
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞