[NSData dataWithContentsOfFile]的内存问题

Pla*_*ool 0 cocoa-touch objective-c

我正在开发需要图像缓存的应用程序.为此,我使用JMImageCache库.它适用于缓存.但它无法释放下一行占用的内存.

[NSData dataWithContentsOfFile]
Run Code Online (Sandbox Code Playgroud)

这里,是来自磁盘的缓存图像的内容代码的功能.

- (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;
}
Run Code Online (Sandbox Code Playgroud)

我用仪器检查它,每次分配2.34 MB.

小智 5

data = nil;
[data release];
Run Code Online (Sandbox Code Playgroud)

你为什么期望这一点起作用?为什么要发布原始数据?你正在发送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];
}
Run Code Online (Sandbox Code Playgroud)

二,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;
}
Run Code Online (Sandbox Code Playgroud)