一、問題描述:
? ? ? 開發(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; ? } 就好了