iOS 解析[xxxxController respondsTo
2018-02-23 本文已影响44人
走向菜鸟的菜鸟
崩溃原因:
[xxxxController respondsToSelector:]: message sent to deallocated instance 0x1310293e0
场景复现:
从产品列表页跳转到产品详情页,返回到产品列表页,切换tabItem,再返回到产品的tabItem,出现崩溃到main函数的现象,使用僵尸模式复现崩溃现象,得到[xxxxController respondsToSelector:]: message sent to deallocated instance 0x1310293e0
的崩溃原因。
问题解析:
由于控制器释放,又再次向这个VC调用了某些请求导致崩溃。出现该问题的原因,大部分是由于实现了xxx.delegate = self
;当VC释放后,这个xx还没有被释放,所以xx的回调方法还在调用delegate即这里的VC,所以崩溃就发生了。
查找原因:
针对该控制器VC中所有添加delegate的代码,一个一个排查,最后发现在基类BaseViewController中使用了self.navigationController.delegate = self
;进行实现导航控制器代理方法了,使用完之后没有释放。
错误解决办法:
- 在该控制器VC的
- (void)dealloc {}
方法中实现self.navigationController.delegate = nil
,由于dealloc的延迟调用,还是无法解决问题。 - 在该控制器VC的
- (void)viewWillDisappear:(BOOL)animated {}
方法中实现self.navigationController.delegate = nil
,但是会导致基类BaseViewController的导航控制器代理方法失效。
正确解决办法:
在该控制器VC的基类BaseViewController中进行解决:
- (void)viewWillAppear:(BOOL)animated {
[super viewWillAppear:animated];
self.navigationController.delegate = self;
}
- (void)viewWillDisappear:(BOOL)animated {
[super viewWillDisappear:animated];
self.navigationController.delegate = nil;
}