iOS程序crash的几种情况

调用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);
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • *面试心声:其实这些题本人都没怎么背,但是在上海 两周半 面了大约10家 收到差不多3个offer,总结起来就是把...
    Dove_iOS阅读 27,307评论 30 472
  • iOS网络架构讨论梳理整理中。。。 其实如果没有APIManager这一层是没法使用delegate的,毕竟多个单...
    yhtang阅读 10,652评论 1 23
  • 背景 众所周知,对于移动客户端而言,crash对于用户是一种非常糟糕的体验,crash率对于一款移动应用而言也是一...
    东野浪子阅读 12,103评论 2 8
  • Baymax:网易iOS App运行时Crash自动防护实践 版权声明本文转自网易杭州前端技术部公众号,由作者授权...
    IOS开发攻城狮_Fyc阅读 11,729评论 2 34
  • 你是谁 / 你从哪里来 / 你到哪里去 / 我都还记得 “两姓联姻,一堂缔约,良缘永结,匹配同称。看此日桃花灼灼,...
    观海难水阅读 3,942评论 8 4