首先,我没有使用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,效果很好而且非常易于使用。
答案 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会为您完成所有事情,并具有内存缓存和磁盘缓存