ios - UIPageViewController 在低内存期间翻转太快时崩溃

标签 ios automatic-ref-counting uipageviewcontroller

由于 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,你有三种方法:

  1. 实现一个“轻型”viewDidLoad 方法(实际上,整个初始化/初始显示序列):在某些应用程序中,它是有意义的,例如,加载低分辨率图像而不是将显示的高分辨率图像;或者,稍微延迟页面所需的额外资源(数据库访问、声音等)的分配;

  2. 使用一个页面池,比如三个页面的数组(或 5 个,这取决于您的应用程序),您不断“重复使用”,以便您的应用程序的内存配置文件保持稳定并避免峰值;

  3. 仔细检查分配和释放内存的方式;从这个意义上说,你经常读到 autorelease 为释放/释放机制添加了一些“惯性”,这很容易理解:如果你有一个自动释放的对象,只有当你循环通过它时,它才会被释放池释放主循环(这适用于主释放池);因此,如果您在翻页时调用了一长串方法,这将使释放/解除分配发生得更晚。

在内存使用优化方面没有神奇的子弹,这是一项非常详细和艰苦的工作,但是如果您检查代码并应用这 3 条准则,您将能够减少应用程序的内存配置文件。特别是,检查 Instruments 中的内存分配峰值并试图了解它们之间的关联是非常强大的。

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

相关文章:

ios - main 方法和 block 中的内存泄漏

ios - 转换为 ARC 时 NSMakeCollectable 出现问题

arrays - 选择数组中的中间值 - Swift

iphone - Xcode:存储在 'notification' 中的对象的潜在泄漏

UIScrollView中的iOS UITextField没有响应

ios - UIButton 在 uiscrollView 中不起作用

ios - 带有 2 个换行符的 NSmutablestring 使程序崩溃

ios - CGImageCreateWithImageInRect 持有图像数据 - 泄漏?

IOS - 如何使用来自不同 XIB 文件的多个 ViewController 创建 UIPageViewController

ios - 在 UIPageViewController 中使用 2 个不同的 View Controller 作为页面