由于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
方法(实际上是整个初始化/初始显示序列):在某些应用中,例如,加载低分辨率图像而不是将要显示的高分辨率图像是有意义的;或者,稍微延迟页面所需的其他资源(数据库访问,声音等)的分配; 关于内存使用优化,这没有什么神奇的子弹,这是相当详细且艰巨的工作,但是IME如果您查看代码并应用这3条准则,则可以减少应用程序的内存配置文件。特别是,检查Instruments中的内存分配峰值并尝试了解它们之间的关系非常强大。
关于ios - 在内存不足时快速翻转时,UIPageViewController崩溃,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/10576671/