重用 UIViewControllers 的最佳实践是什么?在许多应用程序中(包括 Apple 自己的示例:例如 SQLiteBooks),每次都会分配和初始化 UIViewController,将 UIViewController 推送到堆栈中。这增加了每个新控制器的内存使用,因为对象保留在内存中并且不会再次使用。
如何让它变得更好?
重用 UIViewControllers 的最佳实践是什么?在许多应用程序中(包括 Apple 自己的示例:例如 SQLiteBooks),每次都会分配和初始化 UIViewController,将 UIViewController 推送到堆栈中。这增加了每个新控制器的内存使用,因为对象保留在内存中并且不会再次使用。
如何让它变得更好?
这增加了每个新控制器对内存的使用,因为对象保留在内存中并且不会再次使用。
它应该在堆栈弹出时被释放,只要你没有其他东西抓住它。检查您的 dealloc 方法是否被调用。
此外,如果它被推入堆栈,那么您至少需要保留它直到它被弹出(如果您遵循标准模式,这会自动发生)。所以又被使用了。
因此,遵循标准模式应该已经使您的内存使用量尽可能小。
您实际上是否有要解决的内存问题,或者这是过早优化的情况?我会说,除非存在特定的资源问题,否则最好的做法是遵循标准的视图控制器模式。
这是我在创建新的视图控制器时所做的,当视图从窗口中删除时内存被释放
MyViewController *mvc = [[[MyViewController alloc] initWithNibName:@"MyView" bundle:nil] autorelease];
[[self navigationController] pushViewController:mvc animated:YES];
在视图控制器的 dealloc 函数中放置一个断点,并确保在从窗口中删除视图控制器时调用它。记忆不应该继续积累。如果您正确地创建和自动释放控制器(如上所示的 LostInTransit),则每个控制器的内存应在删除时释放。
如果你看到 dealloc 没有被调用,这意味着应用程序中的某个地方仍然存在对视图控制器的引用。
不要忘记视图控制器不是您的视图。
视图控制器持有的视图可以卸载,因此视图控制器本身非常轻量级。如果你想保持足迹真的很轻,你可以取消控制器在 viewDidUnload 中分配的任何其他数据(通常在出现内存警告时调用 - 虽然它是 3.0 唯一的东西)。
如前所述,当您离开它们(回击)时,大多数视图控制器将被释放,因此通常不会有任何闲逛。但有时,如果我想以用户离开它的相同状态重新打开该视图(在应用程序启动之间不起作用),我发现留下参考很方便。