iPhone:使用视图控制器以节省内存

时间:2009-06-23 10:29:51

标签: iphone cocoa-touch memory-management uiviewcontroller

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

如何让它变得更好?

5 个答案:

答案 0 :(得分:4)

  

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

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

此外,如果它被推入堆栈,那么你需要保持它至少直到它被弹出(如果你遵循标准模式会自动发生)。所以它 再次使用。

因此遵循标准模式应该已经将内存使用量保持在可以逃脱的范围内。

答案 1 :(得分:1)

您确实遇到了您要解决的内存问题,或者这是premature optimization的情况吗?我会说,除非存在特定的资源问题,否则最佳做法是遵循标准的视图控制器模式。

答案 2 :(得分:1)

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

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

答案 3 :(得分:1)

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

如果您看到dealloc未被调用,则意味着应用程序中某处仍然存在对视图控制器的引用。

答案 4 :(得分:1)

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

视图控制器持有的视图可以卸载,因此视图控制器本身非常轻量级。如果你想保持足迹非常轻,你可以使控制器在viewDidUnload中分配的任何其他数据无效(主要是在有内存警告时调用 - 虽然它只是3.0但是)。

如前所述,大多数视图控制器将在您离开时被释放(回击),因此通常不会有任何悬挂。但有时我发现,如果我想在用户离开它的同一状态下重新打开该视图(在应用程序启动之间无效),请留下引用。