iPhone:重用UIViewController以节省内存

iPhone:重用UIViewController以节省内存,iphone,cocoa-touch,memory-management,uiviewcontroller,Iphone,Cocoa Touch,Memory Management,Uiviewcontroller,重用UIViewController的最佳实践是什么?在许多应用程序中(包括苹果自己的示例:例如SQLiteBooks),UIViewController每次都被分配和初始化,UIViewController被推送到堆栈中。这增加了每个新控制器的内存使用,因为对象保留在内存中,不再使用 如何使其更好?您是否确实存在试图解决的内存问题,或者这是一个问题?我想说的是,除非有特定的资源问题,否则最佳实践是遵循标准的视图控制器模式 这增加了内存的使用 每个新控制器,因为 对象保留在内存中,不在内存中 再

重用UIViewController的最佳实践是什么?在许多应用程序中(包括苹果自己的示例:例如SQLiteBooks),UIViewController每次都被分配和初始化,UIViewController被推送到堆栈中。这增加了每个新控制器的内存使用,因为对象保留在内存中,不再使用


如何使其更好?

您是否确实存在试图解决的内存问题,或者这是一个问题?我想说的是,除非有特定的资源问题,否则最佳实践是遵循标准的视图控制器模式

这增加了内存的使用 每个新控制器,因为 对象保留在内存中,不在内存中 再次使用

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

另外,如果它被推到堆栈中,那么您需要将它保持在周围,至少直到它被弹出(如果您遵循标准模式,这会自动发生)。所以它被再次使用


因此,遵循标准模式应该已经可以使内存使用量尽可能小。

这是我在创建新的viewcontroller时所做的,当视图从窗口中删除时,内存将被释放

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

在视图控制器的dealloc函数中放置一个断点,并确保在从窗口中删除视图控制器时调用该断点。记忆不应该一直积累。如果您正确地创建并自动释放控制器(如LostInTransit上面所示),则每个控制器的内存应在移除时释放


如果您看到dealloc没有被调用,这意味着应用程序中的某个地方仍然存在对视图控制器的引用。

不要忘记视图控制器不是您的视图

视图控制器持有的视图可以卸载,因此视图控制器本身非常轻量级。如果您想让内存占用非常少,您可以取消控制器在viewDidUnload中分配的任何其他数据(大多数情况下在出现内存警告时调用,但这是3.0版的唯一功能)


如前所述,当您离开视图控制器(回击)时,大多数视图控制器将被解除分配,因此通常不会有任何问题。但有时,如果我想以用户留下的状态重新打开该视图(在应用程序启动之间不起作用),我会发现留下一个引用很方便。

这还不是内存问题。但我看到仪器中的内存字节计数器在快速增长。我开发了一个应用程序,它大量使用uicontroller视图。因此,我正在努力防止内存问题。内存使用水平是否会随着时间的推移而下降,还是会一直上升,直到你的应用程序因为内存不足而崩溃?随着新的大型对象被实例化,预计内存使用量将迅速增加。除非你的内存真的用完了,或者内存泄漏了,否则我不会担心的。您可能希望检查您是否正在努力执行内存管理,但我肯定不会基于使用更少内存的不正当愿望来设计您的设计。