iOS 常见 Crash 及解决方案

一、经常遇到的bug

1:访问了一个已经被释放的对象(MRC环境中常见)

obj这个对象已经被释放,但是指针没有置空,这时访问这个指针指向的内存就会 Crash

NSNotification/KVO 只addObserver并没有removeObserver2:访问数组类对象越界或插入了空对象

block 没有判空

一个固定数组有一块连续内存,数组指针指向内存首地址,靠下标来计算元素地址,如果下标越界则指针偏移出这块内存,会访问到野数据,ObjC 为了安全就直接让程序 Crash 了。

而 nil 对象在数组类的 init 方法里面是表示数组的结束,所以使用 addObject 方法来插入对象就会使程序挂掉(因为nil后有可能还有别的数据,如何系统在这里就判断结束,是不是不安全啊!!!)。如果实在要在数组里面加入一个空对象,那就使用 NSNull。

3、访问了不存在的方法

ObjC 的方法调用跟 C++ 很不一样 ,C++ 在编译的时候就已经绑定了类和方法,一个类不可能调用一个不存在的方法,否则就报编译错误。而 ObjC 则是在 runtime 的时候才去查找应该调用哪一个方法。(消息机制的原理)

respondsToSelector (判断对象是否能够相应改方法)

4、多线程并发操作

(多条线程操作同一块资源) 加锁 (死锁:两个线程都在等待)

5、Repeating NSTimer

NSTimer 跟 runloop关系 当scrollView滚动,timer停止运行

NSTimer 在控制器不释放,因为Runloop对NStime有强引用 调用timer 的invalid,runloop不会强引用timer

而timer会对self强引用

解决:转移timer target

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

推荐阅读更多精彩内容

  • 一、访问了一个已经被释放的对象 在不使用 ARC 的时候,内存要自己管理,这时重复或过早释放都有可能导致 Cras...
    李华光阅读 5,794评论 0 1
  • 1,NSObject中description属性的意义,它可以重写吗?答案:每当 NSLog(@"")函数中出现 ...
    eightzg阅读 9,622评论 2 19
  • runtime 和 runloop 作为一个程序员进阶是必须的,也是非常重要的, 在面试过程中是经常会被问到的, ...
    SOI阅读 21,928评论 3 63
  • runtime 和 runloop 作为一个程序员进阶是必须的,也是非常重要的, 在面试过程中是经常会被问到的, ...
    made_China阅读 4,930评论 0 7
  • 把网上的一些结合自己面试时遇到的面试题总结了一下,以后有新的还会再加进来。 1. OC 的理解与特性 OC 作为一...
    AlaricMurray阅读 7,372评论 0 20