Objective-C imageWithCGImage内存泄漏

时间:2011-10-05 12:37:22

标签: objective-c

我想将所有照片从资源保存到某个文件夹。通过以下方式执行此操作:

ALAssetRepresentation *representation = [asset defaultRepresentation];
CGImageRef imageRef = [representation fullResolutionImage]; 

ALAssetOrientation orientation = [representation orientation];
UIImage *image = [UIImage imageWithCGImage:imageRef scale:1.0 orientation:(UIImageOrientation)orientation];

CGFloat compressionQuality = 1.0;
NSData *imageData = [NSData dataWithData:UIImageJPEGRepresentation(image, compressionQuality)];
[imageData writeToFile:path atomically:YES];

CGImageRelease(imageRef);

我启用了自动引用计数。此代码位于自动释放池中。它有CGImageRef对象的内存泄漏。如果我要做

CGImageRelease(imageRef);
CGImageRelease(imageRef);

两次没有内存泄漏。为什么?有人可以帮帮我吗?

1 个答案:

答案 0 :(得分:8)

这是iOS中令人难以置信的一个错误。显然,当你使用imageWithCGImage:方法创建一个UIImage时,它会保留原始的 CGImageRef ,即使你释放了UIImage本身也不会被释放(如果你使用ARC就把它设置为nil)!所以你必须明确地发布它:

UIImage *image = [UIImage imageWithCGImage:imageRef scale:1.0 orientation:(UIImageOrientation)orientation];
CGImageRelease(imageRef);
...
CGImageRelease(image.CGImage);
image = nil; // once you are done with it

花费我一整天的时间来挖掘,直到我遇到这个实际包含答案的问题。在调试这个无法形容的bug时,我可以一直向Apple发送账单吗?

更正:这不是iOS错误,这是我的愚蠢错误。在某些时候,我通过私人类别“劫持”了UIImage的 dealloc 方法来进行一些调试并忘记了它。这是一个错误的事情,因为在这种情况下,实际对象上的dealloc永远不会被调用。因此最终的结果是预期的:UIImage没有机会完成所有在解除分配时应该做的内务处理。永远不要通过私人类别覆盖dealloc。