为什么 ARC 在调用 popViewControllerAnimation 时不释放内存



我的项目使用ARC,当我必须用导航控制器显示视图时,我会这样做:

ShareViewController_iPhone *share = [[ShareViewController_iPhone alloc] initWithNibName:@"ShareViewController_iPhone" bundle:nil];
[self.navigationController pushViewController:share animated:YES];

我可以在xcode中看到内存增加了一定的值,然后当我忽略视图时,我会这样做:

[self.navigationController popViewControllerAnimated:YES];

但是当视图关闭时,内存不会减少,我该怎么做呢?

当您弹出视图控制器时,它被标记为解除分配(即,除非被另一个对象引用,否则它的引用计数将变为0)。但不会立即解除分配。到目前为止,我看到的交易大多是随机的!

这里的视图控制器必须由导航控制器本身保留一段时间才能创建动画。解除分配确实在引用计数降至零后立即发生。尝试在没有动画的情况下弹出视图控制器(例如animated:NO),并亲自查看解除分配是否立即发生。

ARC将在其自己的周期中清理内存(它将收集所有引用计数设置为"0"的对象,表示这些对象已准备好释放),我们无法控制这一点。它由操作系统管理。

因此,当您弹出视图控制器时,它不会立即将其从内存中释放。这可能需要时间,具体取决于其他内存使用情况/内存可用性。

还有一种情况,你需要检查每次推送时内存分配是否增加了一定的值,那么你的代码肯定会有问题。

当你弹出一个ViewController而它没有释放时,这意味着你的控制器中有一个引用循环。您必须检查委托是否具有、块、弱、强引用。

  • 您的委托必须是弱引用
  • 如果使用块。self必须是弱引用:__weak id weakSekf=self

希望这些信息能对你有所帮助

最新更新