首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >在内存不足时,如果翻转速度过快,UIPageViewController会崩溃

在内存不足时,如果翻转速度过快,UIPageViewController会崩溃
EN

Stack Overflow用户
提问于 2012-05-14 09:41:35
回答 3查看 10K关注 0票数 19

由于Xcode的UIPageViewController模板缓存了所有页面数据,所以我有一些内存问题,所以我将其更改为动态加载页面,所以现在当我的应用程序收到内存不足警告时,它会释放内存以避免页面不显示,但如果用户通过点击屏幕边缘快速翻阅页面,它仍然会崩溃。我猜这是因为当didReceiveMemoryWarning被调用时,它不能足够快地释放内存。如果用户翻得很慢,它就可以正常工作。我限制了用户翻页的速度,但它仍然会发生。我希望每次翻页时都能释放内存,而不必等待内存不足的警告。我用的是ARC。有没有办法做到这一点?或者我还能做些什么来防止这种情况发生?谢谢。

编辑:

代码语言:javascript
复制
(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];
}
EN

回答 3

Stack Overflow用户

发布于 2012-09-29 01:37:22

以下是我所做的额外更改,可能会对某些人有所帮助:

基本上,如果前一页已经结束,我只允许新的一页开始。

我使用苹果默认的PageViewController项目作为模板,所以我将使用该项目中定义的术语。

每当通过viewControllerAtIndex:请求页面VC时,我在ModelController上将一个名为'shouldDenyVC‘的布尔值设置为YES

在我的EbookViewController (UIPageViewController的代理)中,我捕获了手势识别器,并将EbookViewController指定为它们的代理:

代码语言:javascript
复制
self.view.gestureRecognizers = self.pageViewController.gestureRecognizers;
for (UIGestureRecognizer *gr in self.view.gestureRecognizers) {
    gr.delegate = self;
}

然后,我可以通过拒绝手势识别器来拒绝翻页:

代码语言:javascript
复制
- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceiveTouch:    (UITouch *)touch
{
    if (_modelController.shouldDenyPageTurn == YES) {
        return FALSE;
    }
    return TRUE;
}

最后,我在UIPageViewController委托方法pageViewController:didFinishAnimating:previousViewControllers:transitionCompleted:的末尾设置了_modelController.shouldDenyPageTurn = NO

我还必须在任何预加载的末尾设置_modelController.shouldDenyPageTurn = NO,以便允许在bat之外进行翻页。

票数 2
EN

Stack Overflow用户

发布于 2012-05-28 09:41:54

目前,iOS5中存在一个错误,会导致滚动视图泄漏少量内存。

您是否尝试过在检查分配和内存泄漏的工具中分析您的应用程序?

您可以在模拟器中模拟内存不足警告(hardware -> simulate memory warning)。或者你可以通过代码来实现(只需记住在调试后删除,因为这会导致你的应用被拒绝!)

代码语言:javascript
复制
[[UIApplication sharedApplication] performSelector:@selector(_performMemoryWarning)];

如果您使用的是strongretain属性,那么在使用它们之后将它们设置为nil,并且ARC将在幕后释放它们所指向的内存。

如果要创建大量临时对象(不是属性或未分配的对象),请插入一个自动释放池:

代码语言:javascript
复制
@autoreleasepool {

}

最后,展示一些代码,我们可以更好地帮助您。

票数 0
EN

Stack Overflow用户

发布于 2012-07-19 16:38:39

它可能是由渲染引起的。当翻页过快时,重新绘制"Page“所使用的内存和CPU将迅速增加。如果你在UIPageViewController中使用的视图是基于CALayer的,并且页面太多,翻得太快肯定会导致应用程序崩溃。

一种解决方案是自定义图层并缓存渲染结果。仅在必要时重新呈现内容。但高速缓存可能会增加内存使用量。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10576671

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档