首先說(shuō)一下 EXC_BAD_ACCESS 這個(gè)錯(cuò)誤峡眶,可以這么說(shuō)剧防,90%的錯(cuò)誤來(lái)源在于對(duì)一個(gè)已經(jīng)釋放的對(duì)象進(jìn)行release操作。你需要在每個(gè)object(或者用Method Swizzling自己搜方法辫樱,可以不用每個(gè)object都寫(xiě))的.m或者.mm文件中加入上面代碼诵姜,并且在 other c flags中加入-D FOR_DEBUG(記住請(qǐng)只在Debug Configuration下加入此標(biāo)記)。這樣當(dāng)你程序崩潰時(shí)搏熄,Xcode的console上就會(huì)準(zhǔn)確地記錄了最后運(yùn)行的object的方法棚唆。
#ifdef _FOR_DEBUG_
-(BOOL) respondsToSelector:(SEL)aSelector {
printf("SELECTOR: %s\n", [NSStringFromSelector(aSelector) UTF8String]);
return [super respondsToSelector:aSelector];
}
#endif
1.重寫(xiě)object的respondsToSelector方法,現(xiàn)實(shí)出現(xiàn)EXEC_BAD_ACCESS前訪問(wèn)的最后一個(gè)object心例。
2.打開(kāi)“僵尸模式”能迅速定位宵凌。有時(shí)候只會(huì)打印這樣一句:
message sent to deallocated instance 0x7ff8fdd2f9c0
//0x7ff8fdd2f9c0就是這個(gè)對(duì)象
此時(shí)可以在終端輸入以下命令來(lái)查找
輸入:sudo malloc_history 1527 0x7ff8fdd2f9c0
3.設(shè)置全局?jǐn)帱c(diǎn)快速定位問(wèn)題代碼所在行。
4.Xcode 7 已經(jīng)集成了BAD_ACCESS捕獲功能:Address Sanitizer止后。 用法如下:在配置中勾選?Enable Address Sanitizer瞎惫。
5.通過(guò)instruments的Zombies溜腐。具體查看http://www.reibang.com/p/51188549ff06。