一吃溅、問題描述:
? ? ? 開發(fā)時用的測試機是iOS9系統(tǒng),所以沒有什么問題荞下,過了好多天用iOS8系統(tǒng)的測試機測試時,popWindow和pushWindow發(fā)生crash史飞,一開始我還懷疑是測試機哪里的設(shè)置有問題(原諒我之前還沒遇到過不同系統(tǒng)引起的bug)尖昏,報錯是野指針類型,也就是向已經(jīng)被釋放的對象發(fā)送消息造成的构资,并且也有指出報錯的文件抽诉。
二、問題分析
? ? ? ?怎么定位到野指針的文件吐绵?有兩步:1.通過Product->Scheme->Edit Scheme進入下面編輯頁面掸鹅,選中Arguments tab,增加標計位NSZombieEnabled設(shè)為YES 2. 添加MallocStackLoggingNoCompact拦赠,并且設(shè)置為YES巍沙。然后運行程序,控制臺就會輸出野指針所在的文件:*** -[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需要釋放昨寞,如果不釋放瞻惋,當被設(shè)為delegate的VC釋放的時候,就會發(fā)生野指針問題援岩。那么問題找到了歼狼。
三、問題解決?
? 在viewWillDisappear里面享怀,加上:if (self.navigationController.delegate == self) ? { ?self.navigationController.delegate = nil; ? } 就好了