[NSData dataWithContentsOfFile]的内存问题

时间:2013-01-29 07:19:44

标签: objective-c cocoa-touch

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

3 个答案:

答案 0 :(得分:5)

data = nil;
[data release];

为什么你认为这根本不起作用?为什么要发布原始数据?您正在向release发送nil消息,这是一个无操作。

此外,如果您不使用alloccopy创建对象,则会自动释放。这意味着如果你再次发布它,它将被过度释放,很可能你的应用程序将崩溃。你需要的是:

一。将方法调用包装在显式自动释放池中:

- (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对象非常小。