iOS 视图控制器在退出的时候没有走dealloc,你需要做的事情

本文详细解析了控制器内存优化过程中遇到的问题,特别是控制器在被强引用时未执行dealloc方法的原因,并提供了三个常见原因及解决方案:block块使用不当、NSTimer未销毁和控制器中的代理属性未设置为弱引用。
这几天由于前台的ui没有给我图,所以有点闲,我一直在纠结内存优化的问题。

我昨天发现我的导航控制器在pop的时候居然没有走dealloc方法,我在leaks里面去运行,也没有发现内存泄漏的提示。但是作为一个合格的程序员一定不能允许出现这种情况。所以我开始 一步一步的查询。

归根结底,是因为当前控制器被某个对象强引用在控制器pop的时候count没有减为0,导致控制器的引用计数不为0,系统无法帮你释放这部分内存。

我控制器里面有通知,块比较是容易导致强引用,所以我就在这里面一句一句的去检查,结果在块里面发现了问题。我在块里面有一个地方居然调用self没有用他的弱引用形式,所以导致了self的count加一,最后直接导致控制器在pop的时候没有走dealloc这个方法。

总结了一下控制器被强引用不走dealloc的原因无非就是三中情况:

一.block块使用不当。因为block会对方法中的变量自动retain一次。请检查控制器中block代码。(我的就是因为这没有走dealloc)

二.NSTimer没有销毁。在viewWillDisappear之前需要把控制器用到的NSTimer销毁。

三.控制器中的代理属性一定要是弱引用,不要强引用。
iOS 中的视图控制器是非常重要的组件,它们负责管理应用程序的界面,并且需要及时释放以避免内存泄漏。下面以一个简单的例子来说明视图控制器的释放。 假设我们有一个包含两个视图控制器的应用程序,分别是 AViewController 和 BViewController。AViewController 是主界面,BViewController 是从 AViewController 跳转过来的界面。 在 AViewController 中,我们使用如下代码跳转到 BViewController: ``` BViewController *bvc = [[BViewController alloc] initWithNibName:@"BViewController" bundle:nil]; [self.navigationController pushViewController:bvc animated:YES]; ``` 在 BViewController 中,我们可以通过点击返回按钮来返回到 AViewController。这个过程中,AViewController 会被重新显示出来,但是 BViewController 已经需要了,需要将其释放。 如果我们使用 ARC,那么只需要在 BViewController 中添加如下代码即可: ``` - (void)dealloc { NSLog(@"BViewController dealloc"); } ``` 当 BViewController 被释放时,会自动调用 dealloc 方法,我们可以在这里添加一些清理工作,例如取消网络请求、移除通知等。 如果我们使用手动内存管理(MRC),那么需要在 AViewController 中添加如下代码: ``` - (void)viewWillDisappear:(BOOL)animated { [super viewWillDisappear:animated]; if (![self.navigationController.viewControllers containsObject:self]) { // BViewController 被弹出了,需要释放 [self release]; } } ``` 当 BViewController 被弹出时,会触发 AViewController 的 viewWillDisappear 方法,在这里判断当前视图控制器是否还在导航栈中,如果在就可以释放了。注意,这里需要调用 release 方法来手动释放内存。 总之,无论是使用 ARC 还是手动内存管理,都需要及时释放再需要的视图控制器,以避免内存泄漏。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值