【问题标题】:UIScrollView with many UIImageViews - Memory managementUIScrollView 与许多 UIImageViews - 内存管理
【发布时间】:2011-04-08 01:03:23
【问题描述】:

我在内存管理方面遇到了这个大问题。

问题
我有一个 UIScrollView,我有一个包含 24 个图像路径的数组,我想在启用分页的 UIScrollView 中显示它们。

所有图片大小为 1024x748(iPad 横向分辨率,带状态栏),文件类型为 jpg 或 png。

我使用延迟加载只是为了不超过viewDidLoad时的内存。我将使用来自 Apple 的延迟加载示例和 PageControl。虽然我使用的是UIImageViews 而不是UIViews

所以我的问题是,当我滚动到第三张图片时,我想从UIScrollView 中删除第一张图片并释放它的内存。因为我滚动得越远,就会消耗更多的内存。当我在 UIScrollView 中分页并加载和添加新图像时,使用了大约 5000kb 的内存,当我进入 unloadPage:(见下文)时,没有任何内容被释放。我只是“做错了”吗?

如何正确释放和删除UIImageViews

(我正在使用initWithContentsOfFile: 加载 UIImages)

这是我的代码

@interface SlideViewController : UIViewControllerExtended <UIScrollViewDelegate> {

    ScrollViewController *slider;
    IconView *currentChapter;
    NSMutableArray *chapters;
    NSMutableArray *views;
    UIImageView *controller;

}

延迟加载功能

- (void) loadImageToScrollView:(NSInteger)chapter withPage:(NSInteger)page {


    if (page < 0) return;
    if (page >= chapterCount) return;

    if([views objectAtIndex:page] != [NSNull null]) return;

    NSMutableArray *all = [[currentChapter getImages] copy];

    if(!([[all objectAtIndex:page] rangeOfString:@".mp4"].length > 0)) {
        controller = [views objectAtIndex:page];

        if((NSNull *)controller == [NSNull null]) {

            NSArray *paths = [[all objectAtIndex:page] componentsSeparatedByString:@"."];

            NSString *name = [[NSString alloc] initWithString:[paths objectAtIndex:0]];
            NSString *ending = [[NSString alloc] initWithString:[paths objectAtIndex:1]];

            NSString *file = [[NSString alloc] initWithFormat:@"%@", [[NSBundle mainBundle] pathForResource:name ofType:ending]];

            UIImageView *tempImage = [[UIImageView alloc] initWithFrame:CGRectMake(page * 1024, 0, 1024, 768)];
            UIImage *img = nil;
            img = [[UIImage alloc] initWithContentsOfFile:file];

            [tempImage setImage:img];
            [tempImage setTag:page];

            self.controller = tempImage;
            [tempImage release];

            [slider addSubview:controller];
            [views replaceObjectAtIndex:page withObject:controller];

            [name release];
            [ending release];
            [file release];
        }

    }

    [all release];
}

卸载视图方法(似乎不起作用):

- (void) unloadPage: (int) page {
    if(page < 0) return;
    if(page >= chapterCount) return;
    if((NSNull *)[views objectAtIndex:page] != [NSNull null]) {
        UIImageView *viewToDelete = [views objectAtIndex:page];

        [viewToDelete removeFromSuperview];

        [views replaceObjectAtIndex:page withObject:[NSNull null]];
    }
}

【问题讨论】:

    标签: ipad memory-management memory-leaks uiscrollview uiimageview


    【解决方案1】:

    VSScrollview 虽然我迟到了,但是对于其他用户,我做了一个类,VSScrollview,它重用它的视图,就像 UITableView 重用它的单元格一样。它的使用很简单。浏览链接中的自述文件

    【讨论】:

      【解决方案2】:

      通过在WWDC2010 观看#104 视频会话可以解决问题。可以在Apple Developer site 上找到。

      因此,如果您在加载大图像时遇到内存泄漏问题,请检查一下。真的,真的很有用。

      【讨论】:

      • 会议的全称是“Session 104 - Designing Apps with Scroll Views”
      猜你喜欢
      • 1970-01-01
      • 2011-07-15
      • 2012-06-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-10-23
      • 1970-01-01
      相关资源
      最近更新 更多