UINavigationController.delegate設(shè)置引起的iOS8 crash

一、問題描述:

? ? ? 開發(fā)時用的測試機(jī)是iOS9系統(tǒng),所以沒有什么問題,過了好多天用iOS8系統(tǒng)的測試機(jī)測試時,popWindow和pushWindow發(fā)生crash,一開始我還懷疑是測試機(jī)哪里的設(shè)置有問題(原諒我之前還沒遇到過不同系統(tǒng)引起的bug),報錯是野指針類型,也就是向已經(jīng)被釋放的對象發(fā)送消息造成的,并且也有指出報錯的文件。

二、問題分析

? ? ? ?怎么定位到野指針的文件?有兩步:1.通過Product->Scheme->Edit Scheme進(jìn)入下面編輯頁面,選中Arguments tab,增加標(biāo)計位NSZombieEnabled設(shè)為YES 2. 添加MallocStackLoggingNoCompact,并且設(shè)置為YES。然后運(yùn)行程序,控制臺就會輸出野指針?biāo)诘奈募?** -[AViewController navigationController:animationControllerForOperation:fromViewController:toViewController:]: message sent to deallocated instance 0x1614f18d0 ?

輸出這個錯誤信息之后,我就大概知道了是由于設(shè)置navigationController.delegate引起的,所以去看delegate的類型:@property(nullable, nonatomic, weak) id delegate; 是weak類型啊,不用置為nil了呀,想啊想啊,從iOS8系統(tǒng)下發(fā)生crash,而iOS9下不發(fā)生crash的角度想,于是我去看了官方文檔,在iOS 8.3 to iOS 9.0 API Differences中看到了navigationController.delegate的變化,

因為iOS8的時候是assign類型,所以delegate需要釋放,如果不釋放,當(dāng)被設(shè)為delegate的VC釋放的時候,就會發(fā)生野指針問題。那么問題找到了。

三、問題解決?

? 在viewWillDisappear里面,加上:if (self.navigationController.delegate == self) ? { ?self.navigationController.delegate = nil; ? } 就好了

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容