0

我正在开发需要图像缓存的应用程序。为此,我正在使用 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。

4

3 回答 3

5
data = nil;
[data release];

你为什么期望这一切都有效?为什么要发布原始数据?您将release消息发送到nil,这是一个无操作。

此外,如果您不使用allocor创建对象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;
}
于 2013-01-29T07:26:25.937 回答
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

于 2013-01-29T07:31:31.497 回答
0

由于 UIImage 使用您传递的数据的方式,您尝试执行的操作无法正常工作。数据对象由图像保留,或者更准确地说,由 UIImage 内部具有的 CGImageSource 保留。从这些数据中,它可以随时解压缩和创建图像。CGImageSource 上有一个选项也可以保留解压缩的数据,但 UIImage 不使用它,因为它针对小型 UI 图形进行了优化。

减轻内存压力的一件事是不将整个 NSData 加载到内存中,而是对其进行内存映射。这使得图像的创建或重新创建有点慢,但创建的 NSData 对象相比之下非常小。

于 2013-01-29T08:08:47.867 回答