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

如何让它变得更好?

有帮助吗?

解决方案

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

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

其他提示

  

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

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

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

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

你确实有一个你想要解决的内存问题,或者这是过早优化?我会说,除非存在特定的资源问题,否则最佳做法是遵循标准的视图控制器模式。

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

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

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

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

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

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top