2009-08-12 7 views
3

Je suis curieux si je suis la gestion de la mémoire appropriée avec CGImageRef, que je traverse plusieurs méthodes (puisque son objet CG, je suppose qu'il ne supporte pas autorelease). La gestion de la mémoire avec des objets non NSO et l'interaction avec d'autres objets NSO est encore un peu nouvelle pour moi.Libérer CGImage (CGImageRef)

Voici ce que je fais:

Je crée l'CGImageRef dans mon gestionnaire de cache d'image avec CGBitmapContextCreateImage (conserver le nombre 1), et en ajoutant à la NSMutableDictionary (conserver le nombre 2). Lorsque CALayers utilise l'image, j'affecte avec layer.contents (retain count +1) et efface le contenu avec layer.contents = nil (retain count -1) avant de supprimer le calque.

Enfin, pour dégager la texture, je l'appelle CGImageRefRelease et [NSMutableDictionary removeObject] pour avoir conserver le nombre 0.

Est-ce une bonne façon de le faire?

Répondre

16

Core Foundation objects (which all Core Graphics objects are) do support autorelease.

Les étapes que vous décrivez devrait fonctionner parfaitement et ne coulera pas ou trop libérer l'objet.

J'utilise CFRelease au lieu de fonctions de libération de classe spécifique comme CGImageRelease, mais uniquement pour des raisons de style. Je dois juste me méfier de NULL: CGImageRelease vérifie pour NULL, tandis que CFRelease tombera en panne une fois passé NULL. L'utilisation de CGImageRelease et de ses frères et sœurs signifie que vous n'avez pas à vous en préoccuper.

Je suppose que vous vouliez dire removeObject:forKey:, pas removeObject (qui n'existe pas et n'aurait pas de place pour spécifier un objet de toute façon).

+0

Merci pour le lien, excellente ressource, clarifie beaucoup. Docs mentionné que CGImageRelease ne provoquera pas une erreur si l'image est NULL, si sonnait plus sûr d'aller avec. removeObject: forKey: oui, celui-là. – Rudi

+0

** Le document auquel vous associez ne prend pas en charge votre revendication. ** Certains objets de la base de données Core sont "sans frais pontés" vers les classes Cocoa, mais ils ne le sont pas tous. Vous pouvez transformer un 'CFStringRef' en un' NSString * 'et inversement, mais vous ne pouvez pas le faire avec' CGImageRef' et 'UIImage'. – benzado

+0

Ma réclamation est que les objets CF supportent 'release' et' autorelease'. Ce document le dit explicitement: "Notez, à partir de l'exemple, que les fonctions et méthodes de gestion de la mémoire sont également interchangeables - vous pouvez utiliser' CFRelease' avec un objet Cocoa et 'release' et' autorelease' avec un objet Core Foundation. " La référence de CGImage indique que CGImage descend de CFType: http://developer.apple.com/iphone/library/documentation/GraphicsImaging/Reference/CGImage/ –

Questions connexes