【问题标题】:iPhone: Reusing UIViewControllers in order to save memoryiPhone:重用 UIViewController 以节省内存
【发布时间】:2010-11-05 03:05:58
【问题描述】:

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

如何让它变得更好?

【问题讨论】:

    标签: iphone cocoa-touch memory-management uiviewcontroller


    【解决方案1】:

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

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

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

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

    【讨论】:

      【解决方案2】:

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

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

      【讨论】:

        【解决方案3】:

        您是否真的有一个您正在尝试解决的内存问题,或者这是premature optimization 的情况?我想说,除非存在特定的资源问题,否则最好的做法是遵循标准的视图控制器模式。

        【讨论】:

        • 这还不是内存问题。但我看到 Instruments 中的内存字节计数器增长迅速。我开发了一个应用程序,它大量使用 UIControllerViews。所以我试图防止内存问题。
        • 内存使用量是否趋于平稳,或者它是否会随着时间的推移而持续增长,直到您的应用程序因内存不足而崩溃?随着新的大对象被实例化,预计内存使用量会迅速增加。除非您实际上内存不足或内存泄漏,否则我不会担心。您可能希望检查您是否认真地执行内存管理,但我当然不会基于使用更少内存的无根据的愿望来构建您的设计。
        【解决方案4】:

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

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

        【讨论】:

          【解决方案5】:

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

          视图控制器持有的视图可以卸载,因此视图控制器本身非常轻量级。如果您想保持占用空间非常轻,您可以取消控制器在 viewDidUnload 中分配的任何其他数据(通常在出现内存警告时调用 - 虽然它是 3.0 唯一的东西)。

          如前所述,当您离开(回击)视图控制器时,大多数视图控制器将被释放,因此通常不会有任何闲逛。但有时如果我想以用户离开它的相同状态重新打开该视图(在应用程序启动之间不起作用),我会发现留下参考很方便。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2015-09-19
            • 1970-01-01
            • 1970-01-01
            • 2012-07-14
            • 1970-01-01
            相关资源
            最近更新 更多