3

我正在为 iPad 制作一本交互式书籍,并正在使用UINavigationController它来实现页面和下一个页面之间的导航。当用户翻页时,下一页被推送到导航堆栈的顶部。

我现在进入应用程序的第 15 页,当我尝试从第 14 页转到第 15 页时应用程序崩溃。控制台中没有错误消息,设备的崩溃日志中也没有任何内容。

故事板中每个视图控制器的场景都UIImageViews显示了 5MB 到 20MB 之间的图像。视图控制器的viewDidLoad方法只被调用一次。所有应用程序资产的总大小低于 200B。我正在使用ARC。

我已经使用 Instruments 的 Memory Monitor 运行了该应用程序。每次翻页,应用程序的 Real Memory 消耗增加约 80MB,达到 800MB 时会崩溃(设备为 iPad 3)。

  • 为什么会有如此巨大的内存消耗?这是因为 Storyboard 场景中的 UIImageView 缓存了图像吗?

  • UINavigationController使用 a和 ARC时释放内存的最佳方法是什么 ?

我尝试在视图控制器的方法中添加将所有视图控制器的子视图设置为 nil viewDidDisappear:,但内存消耗保持不变。

4

2 回答 2

7

当您使用 UINavigationController 时,您推送的每个 ViewController 都会永远留在内存中(嗯,直到您的应用程序退出),除非您的用户按下该特定 ViewController 上的后退按钮。它保留了一堆 ViewController——可见的在顶部。

所以简单的答案是不要为此使用 UINavigationController。我建议构建自己的 ViewController 来“知道”下一页和上一页,并在需要时手动加载和删除它们。这样,您可以确保您一次只有一个页面在内存中(除了在转换期间 - 也许您可以将此动画用于转换http://cocoacontrols.com/platforms/ios/controls/xbpagecurl)。

于 2012-06-25T20:38:05.543 回答
2

您可能不想为此目的使用 UINavigationController。你真的想要一个视图控制器来管理你的所有页面,并在同一个视图上呈现新页面,同时删除旧页面。

于 2012-06-25T20:34:49.987 回答