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

时间:2013-12-06 09:39:11

标签: ios objective-c uiviewcontroller automatic-ref-counting

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

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

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

[self.navigationController popViewControllerAnimated:YES];

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

4 个答案:

答案 0 :(得分:0)

当你弹出viewcontroller时,它被标记为deallocation(即它的引用计数变为0,除非被另一个对象引用)。但不能立即解除分配。我所看到的释放大多是随机的!

答案 1 :(得分:0)

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

答案 2 :(得分:0)

ARC会在自己的周期内清理内存(它会收集引用计数设置为“0”的所有对象意味着谁准备好重新分配),我们无法控制它。它由操作系统管理。

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

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

答案 3 :(得分:0)

当您弹出ViewController并且它没有释放时,它意味着在您的控制器中有一个参考周期。如果有,阻止,弱,强引用,你必须检查委托。

  • 你的代表必须是弱参考。
  • 如果使用阻止。自我必须是弱引用:__ weak id weakSekf = self;

希望这些信息对您有所帮助。 :)