CGImageRef Memory leak

前端 未结 4 1033
一个人的身影
一个人的身影 2020-12-10 06:35

I\'m having a memory leak when using this custom method which returns a CGImageRef. I can\'t release \"cgImage\" properly because I have to return it. What chould I do ?

相关标签:
4条回答
  • 2020-12-10 07:19

    cgImage is owned by your method, you need to return it and give responsibility to the caller to release it through CFRelease.

    You can also return the CGImage wrapped inside a UIImage instance, like this:

    UIImage *image = [UIImage imageWithCGImage:cgImage];
    CFRelease(cgImage); //cgImage is retained by the UIImage above
    return image;
    
    0 讨论(0)
  • 2020-12-10 07:19

    You can autorelease a Core Foundation-compatible object. it just looks a bit wonky. :)

    The GC-safe way is like so:

    CGImageRef image = ...;
    if (image) {
        image = (CGImageRef)[[(id)image retain] autorelease];
        CGImageRelease(image);
    }
    

    The shortcut, which is safe on iOS but no longer safe on the Mac, is this:

    CGImageRef image = ...;
    if (image) {
        image = (CGImageRef)[(id)image autorelease];
    }
    

    Either one will place the image in an autorelease pool and prevent a leak.

    0 讨论(0)
  • 2020-12-10 07:22

    As suggested, we used:

    CGImageRelease(imageRef);
    

    but we still got an memory leak. our solution was to wrap code with an

    @autoreleasepool {}
    

    block and that solve our problem.

    0 讨论(0)
  • 2020-12-10 07:25

    This is a general problem with Core Foundation objects because there is no autorelease pool in CF. As I see it, you have two options to solve the problem:

    1. Rename the method to something like -newRectRoundedImageRef:radius: to tell the caller that he takes ownership of the returned object and responsible for releasing it.
    2. Wrap the CGImageRef in an autoreleased UIImage object and return that ([UIImage imageWithCGImage:]). That's probably what I would do.
    0 讨论(0)
提交回复
热议问题