Objective-C nil 崩溃探讨

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

Objective-C nil 崩溃探讨_第1张图片

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

Objective-C nil 崩溃探讨_第2张图片

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

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

Objective-C nil 崩溃探讨_第3张图片

结果

Objective-C nil 崩溃探讨_第4张图片


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


Objective-C nil 崩溃探讨_第5张图片


Objective-C nil 崩溃探讨_第6张图片

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

Objective-C nil 崩溃探讨_第7张图片

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


Objective-C nil 崩溃探讨_第8张图片

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

Objective-C nil 崩溃探讨_第9张图片
这样写同样会崩溃


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

Objective-C nil 崩溃探讨_第10张图片
数组是个空数组

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

但是这样写就不行了

Objective-C nil 崩溃探讨_第11张图片

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


Objective-C nil 崩溃探讨_第12张图片

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

Objective-C nil 崩溃探讨_第13张图片

那我们试试 objectAtIndex:0 

Objective-C nil 崩溃探讨_第14张图片

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

你可能感兴趣的:(Objective-C nil 崩溃探讨)