UIScrollView包含许多UIImageViews - 内存管理

时间:2010-09-03 20:09:05

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

我在内存管理方面存在这个巨大的问题。

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

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

我正在使用延迟加载,只是为了在viewDidLoad时不超过内存。而且我将使用PageControl从Apple的延迟加载样本开始。虽然我使用的是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 个答案:

答案 0 :(得分:7)

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

因此,如果在加载大图像时遇到内存泄漏问题,请查看。这真的非常有用。

答案 1 :(得分:0)

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