由于Xcode的UIPageViewController模板可缓存所有页面数据,所以我遇到了一些内存问题,因此我将其更改为动态加载页面,因此,当我的应用收到内存不足警告时,它将释放页面未显示的内存,但是如果用户通过点击屏幕边缘快速快速浏览页面,仍然崩溃。我猜这是因为调用didReceiveMemoryWarning时无法足够快地释放内存。如果用户缓慢翻转,则效果很好。我限制了用户翻页的速度,但是这种情况仍然存在。我希望每次打开页面时都可以释放内存,而不必等待内存不足的警告。我正在使用ARC。有没有办法做到这一点?还是我可以做些什么来防止这种情况?谢谢。

编辑:

(UIViewController *)pageViewController:(UIPageViewController *)pageViewController viewControllerBeforeViewController:(UIViewController *)viewController
{
    NSUInteger index = [self indexOfViewController:(SinglePageViewControllerSuperclass *)viewController];
    if ((index == 0) || (index == NSNotFound)) {
        return nil;
    }

    index--;
    return [self viewControllerAtIndex:index];
}

(UIViewController *)pageViewController:(UIPageViewController *)pageViewController viewControllerAfterViewController:(UIViewController *)viewController
{
    NSUInteger index = [self indexOfViewController:(SinglePageViewControllerSuperclass *)viewController];
    if (index == NSNotFound || index == MAX_PAGE_INDEX) {
        return nil;
    }

    return [self viewControllerAtIndex:++index];
}

最佳答案

我认为您的假设是正确的,因为我也经历了类似的行为:当您翻到下一页时,同样为了使动画效果更好,在分配旧页面之前要分配新页面,并且需要花费一些时间来分配新页面。旧的将被释放。因此,当您足够快地翻转时,分配对象的速度比释放对象的速度要快,并且最终(实际上很快),您的应用会由于内存使用而被杀死。如果遵循Instruments中的内存分配/取消分配,则翻页时的取消分配延迟将变得非常明显。

IMO有三种解决方法:

  • 实现“轻型” viewDidLoad方法(实际上是整个初始化/初始显示序列):在某些应用中,例如,加载低分辨率图像而不是将要显示的高分辨率图像是有意义的;或者,稍微延迟页面所需的其他资源(数据库访问,声音等)的分配;
  • 使用页面池(例如,由三个页面组成的数组(或5,取决于您的应用程序))来保持“重用”,以便应用程序的内存配置文件保持稳定并避免峰值;
  • 仔细检查您分配和释放内存的方式;从这种意义上讲,您通常会读到自动释放会在释放/释放机制中增加一些“惯性”,这很容易理解:如果您有一个自动释放的对象,则只有当您循环浏览该对象时,它才会由其释放池释放。主循环(对于主版本池是正确的);因此,如果在翻页时调用的方法序列很长,那么释放/取消分配将在以后发生。

  • 关于内存使用优化,这没有什么神奇的子弹,这是相当详细且艰巨的工作,但是IME如果您查看代码并应用这3条准则,则可以减少应用程序的内存配置文件。特别是,检查Instruments中的内存分配峰值并尝试了解它们之间的关系非常强大。

    关于ios - 在内存不足时快速翻转时,UIPageViewController崩溃,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/10576671/

    10-12 00:19
    查看更多