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