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

Eri*_*ric 3 uiimageview ios automatic-ref-counting uistoryboard

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

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

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

我使用Instruments的Memory Monitor运行了应用程序.每次翻页时应用程序的实内存消耗量增加约80MB,当达到800MB时该应用程序崩溃(该设备是iPad 3).

  • 为什么这么大的内存消耗?这是因为故事板场景中的UIImageView缓存了图像吗?

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

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

Ben*_*ton 7

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

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