iOS [xxxxController respondsToSelector:]: message sent to deallocated instance 0x1310293e0崩溃问题

本文分析了一种常见的iOS应用崩溃现象,详细解释了当试图向已释放的实例发送消息时引发的问题,并提供了具体的解决方案。重点在于理解代理模式中如何避免内存泄漏,确保在视图控制器消失时正确解除代理绑定。
崩溃原因:

[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:个人见解,如有错误,还请评论指出,多多指教。

同步简书地址:https://www.jianshu.com/p/9810f21f262d

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值