iphone - 可能优化卸载 UIScrollView 和 PageControl 中不再可见的 View + Controller

标签 iphone memory-management memory-leaks uiscrollview uipagecontrol

我的页面控制代码与苹果示例相同。这里我有一个包含 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/

相关文章:

c - 为什么 yacc 在退出时有内存泄漏?

iphone - 如何将我的 iOS 项目限制为仅限 iPhone 4

c++ - 重置场景时 OpenSceneGraph 内存使用情况

http - 在 Golang 中为 http.Response 使用空白标识符是否足以防止内存泄漏?

python - 使用 Python 多处理进行内存管理

c - malloc 没有返回 NULL 但索引数组给出了段错误

android - AndEngine内存泄漏

iphone - 从 iPhone 中的可变数组中搜索子字符串

iphone - 工具栏动画不流畅

iphone - 从 UIColor 属性设置 UIView 的背景颜色时出现问题