美文网首页ios基础知识
iOS程序crash的几种情况

iOS程序crash的几种情况

作者: DevelopMyLife | 来源:发表于2014-11-23 16:26 被阅读472次

    调用block时没有判断Block是否为空

    如果blocknil,直接调用会crash

    ALiBlock block;
    block();        //block是空的,妥妥的crash
    

    正确的使用方法是先判断block是否为空

    if (block) {
        block();    //确定不为空之后才放心地调用
    }
    

    调用了不存在的方法

    如果不确定对象中是否有该方法,直接调用会有可能导致crash

    NSObject *a = [][NSObject alloc] init];
    [a aaa];                //NSObject里没有叫aaa的方法,这样会crash
    

    正确的使用方法是在不确定对象是否有该方法时,先判断一下

    if ([a respondsToSelector:@selector(aaa)]) {
        [a aaa];            //确定有该方法之后才放心地调用
    }
    

    在cellForRowAtIndexPath中返回了nil

    cellForRowAtIndexPath中返回nil时,会直接crash

    出现这种情况的原因有:

    numberOfRowsInSection返回的数目不正确,导致行数比cellForRowAtIndexPath预期的多,于是cellForRowAtIndexPath就不能正确返回超出预期的cell了。
    cellForRowAtIndexPath中逻辑有误,漏了一些情况,导致有些cell不能正确返回。

    数组越界

    这种老问题不用多说,大家都很熟悉,但是又经常出现。 = = |||

    数组插入了nil对象

    在数组中nil表示数组的结束位置。所以对数组进行insertaddObject操作时,如果插入了一个nil对象,那访问该对象之后的元素都会变成越界,OC为了安全,在插入nil的时候会直接crash

    正确使用方式是如果不确定一个元素是不是为空,就判断一下吧。

    重复release,或者不需要之后没有置空

    比如以下这个情况就会crash

    UILabel *text = [[UILabel alloc] init];
    [text release];
    ...// 中间干了很多事情
    [text release];
    NSLog(@"%@",text);

    相关文章

      网友评论

        本文标题:iOS程序crash的几种情况

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