堆内存在增长

Posted

技术标签:

【中文标题】堆内存在增长【英文标题】:Heap memory is growing 【发布时间】:2012-02-10 08:44:20 【问题描述】:

今天我做了一些测试,我很好奇结果。我制作了一个具有 UINavigationController 和两个 UIViewControllers 的应用程序 (ARC)。在第一个视图中有一个按钮,当按下该按钮时,第二个视图被加载。在第二个视图中,当检测到摇动手势时,第一个视图被加载,依此类推。我在工具中注意到的是,每次加载视图时堆都会增长。这是一些代码

AppDelegate.m

self.navigationController = [[UINavigationController alloc]init];
self.window setRootViewController:self.navigationController];
FirstViewController *firstview = [FirstViewController alloc]init];
[self.navigationController pushViewController:FirstViewController animated:YES]; 

FirstViewController.m

-(IBAction)loadSecondView

  SecondViewController *secondview = [SecondViewController alloc]init];
  [self.navigationController pushViewController:secondview animated:YES];

SecondViewController.m

-(IBAction)loadFirstView

  FirstViewController *firstview = [FirstViewController alloc]init];
  [self.navigationController pushViewController:first view animated:YES];

我不明白为什么会这样。在这种情况下如何避免堆增长?

【问题讨论】:

在你的第二个viewController中已经有一个后退按钮,当你点击它时它会自动工作,所以不需要实现loadFirstView方法。因为每次你创建一个新的FirstViewController实例时,这就是内存堆的原因每次都在增长。 我不想要那个按钮。我想在检测到摇晃手势时工作。 摇晃:[self.navigationController popViewControllerAnimated:YES]; 我已经这样做了,但内存仍在增长 【参考方案1】:

实际上每次创建新的视图控制器对象时.. 都不应该这样做。

因此,每次您分配一个新对象并推送该视图时,它都会被添加到导航堆栈中,因此内存会增长。

相反,当您在第一个视图中并点击按钮时,您可以弹出当前视图控制器并通知AppDelegate 类以显示第二个视图。

类似地,在第二个视图中,当您想要显示第一个视图时,弹出当前视图并通知AppDelegate 类推送第一个视图控制器。

【讨论】:

【参考方案2】:
SecondViewController *secondview = [[[SecondViewController alloc]init] autorelease];

FirstViewController *firstview = [[[FirstViewController alloc]init] autorelease];

你应该自动释放视图控制器(不是 ARC)

如果第二个控制器先打开,你应该做 popViewController。如果你不返回,堆就会增长

【讨论】:

以上是关于堆内存在增长的主要内容,如果未能解决你的问题,请参考以下文章

Android Dalvik虚拟机 堆内存管理 增长&释放

堆、栈和数据存储单元的大小

尽管堆大小相当一致,但 node.js RSS 内存会随着时间的推移而增长

如何在 iOS 中跟踪负责堆增长的代码

C# / .Net Framework 中的堆大小 - 它可以增长吗?如何增长? [复制]

如果/啥时候释放的堆内存被回收?