iPhone:重复使用UIViewControllers以节省内存

3

如何最佳地重复使用UIViewControllers? 在许多应用程序中(包括苹果的示例:例如SQLiteBooks),每次将UIViewController推送到堆栈时都会分配和初始化UIViewControllers。这会随着每个新控制器的出现而增加内存使用,因为对象保留在内存中并且不再被使用。

如何改善呢?

5个回答

4

每次新控制器的使用都会增加内存的使用量,因为对象留在内存中并且不再被使用。

只要没有其他东西持有它,当堆栈弹出时应该释放它。检查你的dealloc方法是否被调用。

此外,如果将其推入堆栈,则需要至少保留到它被弹出(如果遵循标准模式,则自动发生)。因此,遵循标准模式应该已经使您的内存使用量尽可能小。


1

当我创建一个新的视图控制器时,这就是我所做的,当视图从窗口中移除时,内存会被释放。

MyViewController *mvc = [[[MyViewController alloc] initWithNibName:@"MyView" bundle:nil] autorelease];
[[self navigationController] pushViewController:mvc animated:YES];

1

你是否真的遇到了需要解决的内存问题,还是这只是过早的优化?我会说,除非有特定的资源问题,否则最好遵循标准的视图控制器模式。


这还不是内存问题。但我在Instruments中看到内存字节计数器迅速增长。我正在开发一个大量使用UIControllerViews的应用程序,因此我正在尝试防止内存问题。 - Stefan
内存使用会达到平衡状态,还是随着时间的推移不断增长,直到应用程序因为内存耗尽而崩溃?当新的大对象被实例化时,预计内存使用率会迅速上升。除非您实际上已经用完了内存或者存在内存泄漏,否则我不会担心它。您可能希望检查您是否认真执行内存管理,但我肯定不会根据无端的减少内存使用的愿望来设计您的架构。 - teabot

1
在您的视图控制器的dealloc函数中设置断点,并确保在从窗口中删除视图控制器时调用该函数。内存不应该持续增加。如果您正确地创建和自动释放控制器(如上面LostInTransit所示),则每个控制器的内存应在其被删除时释放。
如果您发现dealloc未被调用,则意味着在应用程序中仍存在对视图控制器的引用。

1

不要忘记,视图控制器并不是你的视图。

由视图控制器持有的视图可以卸载,因此视图控制器本身非常轻量级。如果您想保持足够轻便的占用空间,可以在viewDidUnload中将控制器分配的任何其他数据置为空(通常在出现内存警告时调用 - 这只是3.0版本才有的功能)。

正如大多数情况下视图控制器在离开时(点击返回按钮)会被释放,所以通常不会有任何挂起的视图控制器。但有时候,如果我想以用户离开时的相同状态重新打开该视图,则保留一个引用会很方便(在应用程序启动之间不起作用)。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接