我的页面控制代码与苹果示例相同。这里我有一个包含 ImageView 的 subview (controller.view)。现在问题出在内存管理上。一切正常。但是当我滚动 5-10 页时。 RAM 已满。 我尝试释放 View + Controller ,但没有找到任何合适的工作位置/方式。我想发布当前不可见的 View 。 (当前、上一个和下一个 View 除外)
- (void)applicationDidFinishLaunching:(UIApplication *)application {
NSMutableArray *controllers = [[NSMutableArray alloc] init];
for (unsigned i = 0; i < kNumberOfPages; i++) {
[controllers addObject:[NSNull null]];
}
self.viewControllers = controllers;
[controllers release];
scrollView.pagingEnabled = YES;
scrollView.contentSize = CGSizeMake(scrollView.frame.size.width * kNumberOfPages, scrollView.frame.size.height);
scrollView.showsHorizontalScrollIndicator = NO;
scrollView.showsVerticalScrollIndicator = NO;
scrollView.scrollsToTop = NO;
scrollView.delegate = self;
pageControl.numberOfPages = kNumberOfPages;
pageControl.currentPage = 0;
[self loadScrollViewWithPage:0];
[self loadScrollViewWithPage:1];
}
- (void)loadScrollViewWithPage:(int)page {
if (page < 0) return;
if (page >= kNumberOfPages) return;
PageControlExampleViewControl *controller = [viewControllers objectAtIndex:page];
if ((NSNull *)controller == [NSNull null]) {
controller = [[PageControlExampleViewControl alloc] initWithPageNumber:page];
[viewControllers replaceObjectAtIndex:page withObject:controller];
[controller release];
}
if (nil == controller.view.superview) {
CGRect frame = scrollView.frame;
frame.origin.x = frame.size.width * page;
frame.origin.y = 0;
controller.view.frame = frame;
[scrollView addSubview:controller.view];
}
}
- (void)scrollViewDidScroll:(UIScrollView *)sender {
if (pageControlUsed) {
return;
}
CGFloat pageWidth = scrollView.frame.size.width;
int page = floor((scrollView.contentOffset.x - pageWidth / 2) / pageWidth) + 1;
pageControl.currentPage = page;
[self loadScrollViewWithPage:page - 1];
[self loadScrollViewWithPage:page];
[self loadScrollViewWithPage:page + 1];
}
- (void)scrollViewDidEndDecelerating:(UIScrollView *)scrollView {
pageControlUsed = NO;
}
- (IBAction)changePage:(id)sender {
int page = pageControl.currentPage;
[self loadScrollViewWithPage:page - 1];
[self loadScrollViewWithPage:page];
[self loadScrollViewWithPage:page + 1];
CGRect frame = scrollView.frame;
frame.origin.x = frame.size.width * page;
frame.origin.y = 0;
[scrollView scrollRectToVisible:frame animated:YES];
pageControlUsed = YES;
}
最佳答案
我尝试了几个小时的 Deepmist 代码。它完成了这项工作,但我收到了内存警告,并且我的应用程序每滚动 25-30 页就会崩溃(我在页面中使用大图像)。在 Instruments 中,我注意到内存的使用量非常大:即使一次又一次地从 superview 中删除不必要的 View ,并将相关的 viewController 替换为 NSNulls,Instruments 也显示,每滚动一页,实际内存就会增加 4-5MB!
在网上搜索发现这是一个常见问题。如果您也遇到此问题,您应该尝试以下检查:
1) 在每个 View 中,请务必使用 imageWithContentsOfFile 而不是 imageNamed。正如记录的 imageNamed 缓存图像并增加内存大小。
2) 在 Deepmist 代码中,之后:
[controller.view removeFromSuperview];
您还必须将 View 设置为零:
controller.view=nil;
这个技巧解决了内存消耗问题,现在对于仅加载的三个 View (当前、当前-1和当前+1以避免页面滚动中闪烁)来说内存消耗是稳定的。
希望这有帮助!
关于iphone - 可能优化卸载 UIScrollView 和 PageControl 中不再可见的 View + Controller ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5464364/