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)