Objective-C nil 崩溃探讨

作者: 悟_空 | 来源:发表于2016-04-13 11:12 被阅读519次

    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里面会是什么样呢?请留意后续探讨。

    相关文章

      网友评论

        本文标题:Objective-C nil 崩溃探讨

        本文链接:https://www.haomeiwen.com/subject/evbwlttx.html