UIScrollView和多个UIImageView - 内存管理

4

我有一个关于内存管理的大问题。

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

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

我使用延迟加载只是为了不超过viewDidLoad时的内存。我使用苹果的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]];
    }
}
2个回答

7
问题可以通过观看WWDC2010上的#104视频解决。视频可在Apple Developer网站找到。因此,如果您在加载大图时遇到内存泄漏问题,请查看此视频。它非常有用。

4
本次会议的完整名称是“第104场会议 - 使用滚动视图设计应用程序”。 - Bastian

0

VSScrollview虽然我来晚了,但对于其他用户,我已经制作了一个类VSScrollview,它像UITableView重用其单元格一样重用其视图。它的使用很简单,请查看链接中的自述文件。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接