iOS菜鸟联盟

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;进行实现导航控制器代理方法了,使用完之后没有释放。

错误解决办法:
  1. 在该控制器VC的- (void)dealloc {}方法中实现self.navigationController.delegate = nil,由于dealloc的延迟调用,还是无法解决问题。
  2. 在该控制器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;
}
ps:个人见解,如有错误,还请评论指出,多多指教。
上一篇下一篇

猜你喜欢

热点阅读