我正在开发需要图像缓存的应用程序。为此,我使用JMImageCache库。它适用于缓存。但它无法释放占用的内存 以下一行。
[NSData dataWithContentsOfFile]
这里是来自磁盘的缓存图像的内容代码的功能。
- (UIImage *) imageFromDiskForURL:(NSString *)url {
NSData *data = [NSData dataWithContentsOfFile:cachePathForURL(url) options:0 error:NULL];
UIImage *i = [[[UIImage alloc] initWithData:data] autorelease];
data = nil;
[data release];
return i;
}
我用仪器检查它,每次分配2.34 MB。
答案 0 :(得分:5)
data = nil;
[data release];
为什么你认为这根本不起作用?为什么要发布原始数据?您正在向release
发送nil
消息,这是一个无操作。
此外,如果您不使用alloc
或copy
创建对象,则会自动释放。这意味着如果你再次发布它,它将被过度释放,很可能你的应用程序将崩溃。你需要的是:
一。将方法调用包装在显式自动释放池中:
- (UIImage *)imageFromDiskForURL:(NSString *)url
{
UIImage *i;
@autoreleasepool {
NSData *data = [NSData dataWithContentsOfFile:cachePathForURL(url) options:0 error:NULL];
i = [[UIImage alloc] initWithData:data];
}
return [i autorelease];
}
二,alloc-init或手动释放数据对象:
- (UIImage *)imageFromDiskForURL:(NSString *)url
{
NSData *data = [[NSData alloc] initWithContentsOfFile:cachePathForURL(url) options:0 error:NULL];
UIImage *i = [[[UIImage alloc] initWithData:data] autorelease];
[data release];
return i;
}
答案 1 :(得分:1)
改变序列nil并释放
[data release];
data = nil;
用于清除缓存使用以下委托方法
[[JMImageCache sharedCache] removeAllObjects];
[[JMImageCache sharedCache] removeImageForURL:@"http://dundermifflin.com/i/MichaelScott.png"];
阅读库的自述文件 https://github.com/jakemarsh/JMImageCache/blob/master/README.markdown
答案 2 :(得分:0)
由于UIImage如何使用您传递的数据,您尝试做的事情无法发挥作用。数据对象由图像保留,或者更精确地由UIImage内部的CGImageSource保留。从这些数据中,它可以随时解压缩并创建图像。 CGImageSource上还有一个选项可以保留解压缩后的数据,但UIImage不会使用它,因为它针对小型UI图形进行了优化。
你可以做的一件事就是不要将整个NSData加载到内存中,而是将内存映射到内存中。这使得创建或重新创建图像的速度变慢,但相比之下,创建的NSData对象非常小。