CGImageRef内存泄漏

Lou*_*ker 7 memory-management objective-c quartz-graphics

我在使用这个返回CGImageRef的自定义方法时遇到内存泄漏.我无法正确释放"cgImage",因为我必须将它返回.我该怎么办?

- (CGImageRef)rectRoundedImageRef:(CGRect)rect radius:(int)radius
{
    CGSize contextSize = CGSizeMake(rect.size.width, rect.size.height);     
    CGFloat imageScale = (CGFloat)1.0;
    CGFloat width = contextSize.width;
    CGFloat height = contextSize.height;        
    CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB();
    CGContextRef context = CGBitmapContextCreate(NULL, width * imageScale, height * imageScale, 8, 0, colorSpace, kCGImageAlphaPremultipliedLast);
    // Draw ...
    // Get your image
    CGImageRef cgImage = CGBitmapContextCreateImage(context);       
    CGColorSpaceRelease(colorSpace);
    CGContextRelease(context);
    //CGImageRelease(cgImage); //If I release cgImage the app crashes.
    return cgImage;     
}
Run Code Online (Sandbox Code Playgroud)

Jac*_*kin 17

cgImage由您的方法拥有,您需要返回它并对调用者负责释放它CFRelease.

您还可以返回CGImage包装在UIImage实例中,如下所示:

UIImage *image = [UIImage imageWithCGImage:cgImage];
CFRelease(cgImage); //cgImage is retained by the UIImage above
return image;
Run Code Online (Sandbox Code Playgroud)


Ole*_*ann 10

这是Core Foundation对象的一般问题,因为CF中没有自动释放池.在我看来,你有两个选择来解决这个问题:

  1. 将方法重命名-newRectRoundedImageRef:radius:为告诉调用者他获取返回对象的所有权并负责释放它.
  2. CGImageRef自动释放的UIImage对象换行并返回([UIImage imageWithCGImage:]).这可能就是我要做的.