iOS一個(gè)關(guān)于EXC_BAD_ACCESS的bug調(diào)試經(jīng)歷

問(wèn)題:app點(diǎn)擊重新登陸有時(shí)候會(huì)閃退

1.初步定位

關(guān)注登錄vc和登陸成功跳轉(zhuǎn)vc兩個(gè)界面代碼,這里簡(jiǎn)稱LoginVC和ShowVC。

ShowVC里面有3個(gè)childVC,這里分別簡(jiǎn)稱childVC1,childVC2,childVC3。

在可疑地方大致下斷點(diǎn),重復(fù)調(diào)試了十幾次,bug重現(xiàn),此時(shí)控制臺(tái)log日記為:

*** ASIHTTPRequest? 0x7f8fe3b34110 went went isFinished=YES without being started by the queue it is in

大致意思是指這個(gè)網(wǎng)絡(luò)請(qǐng)求任務(wù)在隊(duì)列里面,但是沒有開始就被取消了。在一個(gè) operation 進(jìn)入隊(duì)列前不可被取消,也就是說(shuō):在 [NSOperation start] 被調(diào)用之前,[NSOperation isCancelled] 函數(shù)的返回值不能是YES。

所以初期的想法是找到這個(gè)0x7f8fe3b34110的NSOperation,簡(jiǎn)稱這個(gè)NSOperation為可疑operation吧,然后判斷它的狀態(tài),如果是已經(jīng)取消的就不要放進(jìn)隊(duì)列。將這兩個(gè)界面的ASIHTTPRequest任務(wù)設(shè)置斷點(diǎn)打印,找到可疑operation,在加入隊(duì)列前進(jìn)行判斷,如果NSOperation.isCancelled為NO才加入隊(duì)列。找了半天,發(fā)現(xiàn)這個(gè)可疑operation是在childVC1里面執(zhí)行的。

但是還是沒有解決為題,報(bào)一樣的錯(cuò)誤日記。想了一下退出登陸的時(shí)候握取消全部任務(wù),但是隊(duì)列沒有銷毀,取消任務(wù)有延時(shí),再次登錄的時(shí)候有隊(duì)列又開始執(zhí)行任務(wù),就會(huì)繼續(xù)報(bào)錯(cuò)。所以嘗試了operation取消成功后,再將重新登錄的任務(wù)加入隊(duì)列,過(guò)程比較繁瑣,并且還是一樣崩潰了,錯(cuò)誤日記還是一樣。

2.再次定位

將childVC1里面和這個(gè)可疑operation有關(guān)的代碼注釋,嘿,正常了不崩潰了。是這個(gè)可疑operation的原因。再將注釋打開,運(yùn)行一遍,bug重現(xiàn)了,此時(shí)Xcode給的提示是

EXC_BAD_ACCESS(code=EXC_I386_GPFLT)

訪問(wèn)了壞內(nèi)存,使用了不存在的對(duì)象的錯(cuò)誤。使用僵尸對(duì)象進(jìn)行調(diào)試,Product -> Edit Scheme ->NSZombieEnabled打勾。

運(yùn)行一遍此時(shí)控制臺(tái)日志為

*** -[childVC1 Retain]:message sent to deallocated instance 0x7f8fe3b2xxxx

在ShowVC找到0x7f8fe3b2xxxx的childVC1,先不讓childVC1釋放,強(qiáng)行持有

在ShowVC創(chuàng)建childVC1的時(shí)候

ChildVC1*childVC1 = [[ChildVC1 alloc]init];

[self addChildViewController:childVC1];

self.childVC1= childVC1;

//關(guān)鍵

CFRetain((__bridgeCFTypeRef)(self.childVC1));

至此,問(wèn)題解決

總結(jié):對(duì)EXC_BAD_ACCESS這個(gè)錯(cuò)誤果斷采取NSZombieEnabled調(diào)試。

如有什么不對(duì)的地方,望各位大神指教

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

推薦閱讀更多精彩內(nèi)容