2

首先,我没有使用 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 会按预期释放,但以下内容仍然停留在我的内存中并发送垃圾邮件: 仪器

显然 CFData、Malloc 9.00 KB、NSConcreteData 都是由我的 downloadImage 方法产生的。我究竟做错了什么?这让我发疯......你如何安全地加载大量远程图像内存?我也尝试了 NSURLConnection,但它是更糟然后更好。:(

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

提前谢谢了!

更新

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

4

1 回答 1

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 库为您做所有事情,并且有 memcache 和磁盘缓存

于 2012-10-27T14:21:12.293 回答