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

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

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

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

结果


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


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

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

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

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

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

但是这样写就不行了

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

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

那我们试试 objectAtIndex:0

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