I’m curious if I’m following proper memory management with CGImageRef, which I’m passing through several methods (since it’s CG object, I assume it doesn’t support autorelease). Memory management with non-NSObjects and interaction with other NSObjects is still somewhat new to me.
Here what I’m doing:
I’m creating the CGImageRef inside my image cache manager with CGBitmapContextCreateImage (retain count 1), and adding it to the NSMutableDictionary (retain count 2).
When CALayers use the image, I assign with layer.contents (retain count +1), and clearing contents with layer.contents = nil (retain count -1) before removing the layer.
Finally, when clearing the texture, I call CGImageRefRelease and [NSMutableDictionary removeObject] to have retain count as 0.
Is this a proper way to do so?
Core Foundation objects (which all Core Graphics objects are) do support autorelease.
The steps you describe should work just fine and not leak or over-release the object.
I use
CFReleaseinstead of specific-class release functions likeCGImageRelease, but purely as a matter of style. I just have to beware ofNULL:CGImageReleasechecks forNULL, whereasCFReleasewill crash when passedNULL. UsingCGImageReleaseand its siblings means you don’t have to worry about this.I’m assuming you meant
removeObject:forKey:, notremoveObject(which doesn’t exist and wouldn’t have somewhere to specify an object anyway).