一、问题描述:
开发时用的测试机是iOS9系统,所以没有什么问题,过了好多天用iOS8系统的测试机测试时,popWindow和pushWindow发生crash,一开始我还怀疑是测试机哪里的设置有问题(原谅我之前还没遇到过不同系统引起的bug),报错是野指针类型,也就是向已经被释放的对象发送消息造成的,并且也有指出报错的文件。
二、问题分析
怎么定位到野指针的文件?有两步:1.通过Product->Scheme->Edit Scheme进入下面编辑页面,选中Arguments tab,增加标计位NSZombieEnabled设为YES 2. 添加MallocStackLoggingNoCompact,并且设置为YES。然后运行程序,控制台就会输出野指针所在的文件:*** -[AViewController navigationController:animationControllerForOperation:fromViewController:toViewController:]: message sent to deallocated instance 0x1614f18d0
输出这个错误信息之后,我就大概知道了是由于设置navigationController.delegate引起的,所以去看delegate的类型:@property(nullable, nonatomic, weak) id delegate; 是weak类型啊,不用置为nil了呀,想啊想啊,从iOS8系统下发生crash,而iOS9下不发生crash的角度想,于是我去看了官方文档,在iOS 8.3 to iOS 9.0 API Differences中看到了navigationController.delegate的变化,
因为iOS8的时候是assign类型,所以delegate需要释放,如果不释放,当被设为delegate的VC释放的时候,就会发生野指针问题。那么问题找到了。
三、问题解决
在viewWillDisappear里面,加上:if (self.navigationController.delegate == self) { self.navigationController.delegate = nil; } 就好了