在UINavigationController上推送许多视图控制器时的内存问题

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

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

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

我使用仪器的内存监视器运行应用程序。 每当新页面打开时,应用程序的真实内存消耗增加约80MB,当达到800MB(设备是iPad 3)时,应用程序崩溃。

  • 为什么如此巨大的内存消耗? 这是因为故事板的场景中的UIImageViewcaching图像?

  • 当使用UINavigationController和ARC时,什么是释放内存的最佳方式?

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

当你使用UINavigationController的时候,你所推送的每个ViewController将永远留在内存中(直到你的应用程序退出),除非你的用户按下该特定ViewController上的后退button。 它保留了一堆ViewControllers – 可见的在顶部。

所以简单的答案是不要为此使用UINavigationController 。 我build议你build立你自己的ViewController,它能够“知道”下一页和上一页,并在需要的时候手动加载和删除它们。 这样,你可以确保你一次只能在内存中有一个页面(除了在转换过程中 – 也许你可以使用这个animation的过渡http://cocoacontrols.com/platforms/ios/controls/xbpagecurl )。

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