堆内存在增长
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。如果你不返回,堆就会增长
【讨论】:
以上是关于堆内存在增长的主要内容,如果未能解决你的问题,请参考以下文章
尽管堆大小相当一致,但 node.js RSS 内存会随着时间的推移而增长