加载大量远程图像 - 内存问题

时间:2012-10-27 13:59:49

标签: ios memory-management uiimageview uiimage

首先,我没有使用ARC,因为我遇到了更大的问题,我需要完全控制内存管理。

情况如下:我需要从服务器加载大量远程JPEG图像并在滚动视图中显示它们。一旦用户向下滚动一下,滚动视图中的顶部图像就会被释放。这是有效的,包含的视图都正常发布。 问题是,在加载远程映像之后,大量内存保持分配状态并且不会被释放。 这是我获取远程图像的代码(子类化UIImageView):

- (void)downloadImage    {
    NSData *posterData = [[NSData alloc] initWithContentsOfURL:self.url options:NSDataReadingUncached error:nil];
    UIImage *img = [[UIImage alloc] initWithData:posterData];
    [posterData release];
    self.image = img;
    [img release];
}
// that gets called from:
- (void)setImageFromURL:(NSURL *)_url{
    [NSThread detachNewThreadSelector:@selector(downloadAndLoadImage) toTarget:self withObject:nil];
}

当我使用Instruments检查我的代码时,我的UIImageView会按预期发布,但以下内容仍然卡在我的内存中并将其保存: Instruments http://s16.postimage.org/rybls16ed/Screen_Shot_2012_10_27_at_8_57_52_AM.png

显然CFData,Malloc 9.00 KB,NSConcreteData都来自我的downloadImage方法。 我究竟做错了什么?这让我发疯了......你怎么加载很多远程图像内存安全? 我也尝试了NSURLConnection,但它更糟糕然后更好。 :(

图像大小从6到25KB不等。

非常感谢提前!

更新

我最终使用SDWebImage,效果很好而且非常易于使用。

1 个答案:

答案 0 :(得分:0)

是在后台线程上下载图像吗?如果是,那么NSAutoreleasePool在哪里?你必须添加:

NSAutoreleasePool* pool = [[NSAutoreleasePool alloc] init];

// your downloading thread code here

[pool release];

或者ARC:

@autoreleasepool {

    // your downloading thread code here

}

此外,如果在后台线程上发生图像下载,则无法执行self.image = img;,您应该在主线程上调用它,因为UI元素只能从主线程修改:

[self performSelectorOnMainThread:@selector(setImage:) withObject:img waitUntilDone:YES];

实际上SDWebImage library会为您完成所有事情,并具有内存缓存和磁盘缓存