首先說一下 EXC_BAD_ACCESS 這個錯誤,可以這么說,90%的錯誤來源在于對一個已經釋放的對象進行release操作。你需要在每個object(或者用Method Swizzling自己搜方法,可以不用每個object都寫)的.m或者.mm文件中加入上面代碼,并且在 other c flags中加入-D FOR_DEBUG(記住請只在Debug Configuration下加入此標記)。這樣當你程序崩潰時,Xcode的console上就會準確地記錄了最后運行的object的方法。
#ifdef _FOR_DEBUG_
-(BOOL) respondsToSelector:(SEL)aSelector {
printf("SELECTOR: %s\n", [NSStringFromSelector(aSelector) UTF8String]);
return [super respondsToSelector:aSelector];
}
#endif
1.重寫object的respondsToSelector方法,現實出現EXEC_BAD_ACCESS前訪問的最后一個object。
2.打開“僵尸模式”能迅速定位。有時候只會打印這樣一句:
message sent to deallocated instance 0x7ff8fdd2f9c0
//0x7ff8fdd2f9c0就是這個對象
此時可以在終端輸入以下命令來查找
輸入:sudo malloc_history 1527 0x7ff8fdd2f9c0
3.設置全局斷點快速定位問題代碼所在行。
4.Xcode 7 已經集成了BAD_ACCESS捕獲功能:Address Sanitizer。 用法如下:在配置中勾選?Enable Address Sanitizer。
5.通過instruments的Zombies。具體查看http://www.lxweimin.com/p/51188549ff06。