美文网首页
iOS 常见 Crash 及解决方案

iOS 常见 Crash 及解决方案

作者: lbfly_boy | 来源:发表于2017-03-09 16:08 被阅读37次

    一、经常遇到的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

    相关文章

      网友评论

          本文标题: iOS 常见 Crash 及解决方案

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