解决iOS开发中涉及到的retain cycle导致控制器无法释放的问题

本文详细介绍了在iOS开发中遇到的一个由于retain cycle导致控制器无法释放的问题,进而引发的列表显示错误。作者通过打印retaincount,采用控制变量法定位问题,最终发现并解决了strong代理、block循环引用、cell对控制器的strong引用以及关联对象等几处内存泄露点。此过程提醒开发者注意内存管理,避免因retain cycle引发的稳定性问题。
摘要由CSDN通过智能技术生成

这几天碰到项目中一个bug,从一个列表进入任务详情页面,回复一条信息后,会导致列表中所有的cell点击进去全都是刚刚回复的那条任务详情。bug不细说,因为同事之前改过一个问题,有一个对列表数据赋值的操作,但是这个操作只会在接口调用完成后在详情控制器里进行,如果退出了,那么控制器销毁后就不会赋值,也就没有后来的bug。因此我检测了内存,调试了控制器的dealloc方法,果然,控制器没有被释放,应该是存在一些retaincycle导致的。

这个问题困扰了我三天,因为这个控制器有4个内嵌控制器,主控制器不能释放,4个内嵌控制器也不能释放,如果有几个retain环的话,那我碰巧改过一个之后,也解决不了问题,为了不引入新bug,只能改回去,这样就无解了。所以解决了一个之后必须记录下来,有思路。

这里比较重要的是,在arc下要打印出关注的控制器的retaincount。这里用到一个方法-

NSLog(@"Retain count is %ld", CFGetRetainCount((__bridge CFTypeRef)theVC));

在跳转过来的控制器中,用weak方式持有一个关注的控制器,就可以在这个关注的控制器被pop的时候打印他的值了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值