问题
I have a method that returns a CGImageRef
object. It contains this call:
CGImageRef posterFrame = [avAssetImage copyCGImageAtTime:time actualTime:nil error:&error];
...
return posterFrame;
This situation, as I understand it, calls for an autorelease. But I have no idea how to do it. I've tried using CFCollectable()
, but it doesn't work. Any ideas?
回答1:
If you're using garbage collection, use CFMakeCollectable(posterFrame)
. If you're using traditional memory management, it's very straightforward:
return (CGImageRef)[(id)posterFrame autorelease];
You cast the CFTypeRef
(in this case, a CGImageRef
) to an Objective-C object pointer, send it the -autorelease
message, and then cast the result back to CGImageRef
. This pattern works for (almost) any type that's compatible with CFRetain()
and CFRelease()
.
回答2:
Core Graphics (and Core Foundation) doesn't have an autorelease pool, so if you want to return your CGImageRef
you need to either name your function containing Create
(f.e. MyCreatePosterImage()
) or return UIImage
object instead:
CGImageRef posterFrame = [avAssetImage copyCGImageAtTime:time actualTime:nil error:&error];
UIImage *result = [UIImage imageWithCGImage:posterFrame];
CGImageRelease(posterFrame);
return result;
来源:https://stackoverflow.com/questions/7061149/how-to-autorelease-a-cgimageref