Libérant CGImage (CGImageRef)
Je suis curieux de savoir si je suis la bonne gestion de la mémoire avec CGImageRef, je suis de passage par le biais de plusieurs méthodes (puisque c'est la CG objet, je suppose qu'il ne prend pas en charge autorelease). Gestion de la mémoire avec les non-NSObjects et l'interaction avec d'autres NSObjects est encore un peu nouveau pour moi.
Ici ce que je fais:
Je suis de la création de la CGImageRef à l'intérieur de mon image de gestionnaire de cache avec CGBitmapContextCreateImage (conserver le comte 1), et de l'ajouter à la NSMutableDictionary (conserver compter 2).
Quand CALayers usage de l'image, je cède à la couche.contenu (retain count +1), et effacer le contenu avec la couche.contenu = nil (retain count -1) avant de retirer la couche.
Enfin, lors de l'effacement de la texture, je l'appelle CGImageRefRelease et [NSMutableDictionary removeObject] pour conserver le comte comme 0.
Est-ce une bonne façon de le faire?
OriginalL'auteur Rudi | 2009-08-12
Vous devez vous connecter pour publier un commentaire.
Fondement de base d'objets (lequel tous les objets Graphiques sont) en charge d'autorelease.
Les étapes que vous décrivez devrait fonctionner très bien, et pas de fuite ou de libération de l'objet.
- Je utiliser
CFRelease
au lieu d'être spécifiques de la classe de libération des fonctions commeCGImageRelease
, mais uniquement comme une affaire de style. Je viens d'avoir à se méfier deNULL
:CGImageRelease
vérifieNULL
, alors queCFRelease
un crash lorsqu'il est passéNULL
. À l'aide deCGImageRelease
et de ses frères et sœurs signifie que vous n'avez pas à vous inquiéter à ce sujet.Je suis en supposant que vous avez voulu dire
removeObject:forKey:
, pasremoveObject
(qui n'existe pas et n'aurait pas quelque part pour spécifier un objet de toute façon).Le document que vous lien n'a pas l'appui de votre demande. Certains objets de la Fondation sont "sans frais comblé" de Cacao classes, mais tous ne sont pas. Vous pouvez jeter un
CFStringRef
à unNSString *
et vice versa, mais vous ne pouvez pas le faire avecCGImageRef
etUIImage
.Ma demande est que FC support des objets
release
etautorelease
. Ce document explicitement dit: “Note à partir de l'exemple de la gestion de la mémoire de fonctions et de méthodes sont également interchangeables—vous pouvez utiliserCFRelease
avec un Cacao objet etrelease
etautorelease
avec un Fondement de Base de l'objet.” En outre, la CGImage de référence dit que CGImage descend de CFType: developer.apple.com/iphone/library/documentation/...Alors, en un mot, oui, c'est fait.
Je pensais que c'était en se référant au numéro sans frais comblé les objets, qui sont un sous-ensemble de CFTypes, basé sur: "le Tableau 1 fournit une liste des types de données qui sont interchangeables entre le niveau de Base de la Fondation et de la Fondation." Aussi, au bas de la page: "Note: Pas tous les types de données sont sans frais comblé, même si leur nom pourrait laisser croire qu'ils sont. Par exemple, NSRunLoop n'est pas sans frais relié à CFRunLoop, NSBundle n'est pas sans frais relié à CFBundle, et NSDateFormatter n'est pas sans frais relié à CFDateFormatter." Êtes-vous en train de dire que vous pouvez lancer aucun CFType de NSObject et autorelease?
OriginalL'auteur Peter Hosey