我想将所有照片从资源保存到某个文件夹。通过以下方式执行此操作:
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);
两次没有内存泄漏。为什么?有人可以帮帮我吗?
答案 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。