由于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];
}
发布于 2012-09-29 01:37:22
以下是我所做的额外更改,可能会对某些人有所帮助:
基本上,如果前一页已经结束,我只允许新的一页开始。
我使用苹果默认的PageViewController项目作为模板,所以我将使用该项目中定义的术语。
每当通过viewControllerAtIndex:请求页面VC时,我在ModelController上将一个名为'shouldDenyVC
‘的布尔值设置为YES
。
在我的EbookViewController (UIPageViewController的代理)中,我捕获了手势识别器,并将EbookViewController指定为它们的代理:
self.view.gestureRecognizers = self.pageViewController.gestureRecognizers;
for (UIGestureRecognizer *gr in self.view.gestureRecognizers) {
gr.delegate = self;
}
然后,我可以通过拒绝手势识别器来拒绝翻页:
- (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之外进行翻页。
发布于 2012-05-28 09:41:54
目前,iOS5中存在一个错误,会导致滚动视图泄漏少量内存。
您是否尝试过在检查分配和内存泄漏的工具中分析您的应用程序?
您可以在模拟器中模拟内存不足警告(hardware -> simulate memory warning)。或者你可以通过代码来实现(只需记住在调试后删除,因为这会导致你的应用被拒绝!)
[[UIApplication sharedApplication] performSelector:@selector(_performMemoryWarning)];
如果您使用的是strong
或retain
属性,那么在使用它们之后将它们设置为nil
,并且ARC将在幕后释放它们所指向的内存。
如果要创建大量临时对象(不是属性或未分配的对象),请插入一个自动释放池:
@autoreleasepool {
}
最后,展示一些代码,我们可以更好地帮助您。
发布于 2012-07-19 16:38:39
它可能是由渲染引起的。当翻页过快时,重新绘制"Page“所使用的内存和CPU将迅速增加。如果你在UIPageViewController中使用的视图是基于CALayer的,并且页面太多,翻得太快肯定会导致应用程序崩溃。
一种解决方案是自定义图层并缓存渲染结果。仅在必要时重新呈现内容。但高速缓存可能会增加内存使用量。
https://stackoverflow.com/questions/10576671
复制相似问题