2010-10-07 28 views
0

J'ai écrit une méthode pour charger l'image dans CALayer. Voici le code:Garbage Collector et Core Foundation

- (CGImageRef)loadImage:(NSString*)path { 
      // Get data image 
      CGImageRef image = NULL; 
      NSData *data = [NSData dataWithContentsOfFile:path]; 
      CFDataRef imgData = (CFDataRef)data; 
      CGDataProviderRef imgDataProvider = CGDataProviderCreateWithCFData (imgData); 

      // Get CGImage from CFDataRef 
      image = CGImageCreateWithJPEGDataProvider(imgDataProvider, NULL, true, kCGRenderingIntentDefault); 

      // If the image isn't a JPG Image, would be PNG file 
      if (!image) 
       image = CGImageCreateWithPNGDataProvider(imgDataProvider, NULL, true, kCGRenderingIntentDefault); 

      return image; 
} 

J'utilise cette méthode dans mon CALayer:

NSString *pathString = // my image path; 
aLayer = [CALayer layer]; 
aLayer.contents = [self loadImage:pathString]; 

C'est un travail. Je finalise ma vue (en utilisant garbage collector) mais mon application a des fuites. Devrais-je publier CFDataRef imgData? J'ai lu que garbage collector ne fonctionne pas dans Core Foundation.
Merci et excusez mon anglais.

Répondre

3

Vous êtes responsable de la libération de cet objet en appelant CGImageRelease.

Voir la documentation sur la collecte des ordures:

http://developer.apple.com/library/mac/#documentation/cocoa/Conceptual/GarbageCollection/Articles/gcCoreFoundation.html

Par défaut, donc, dans un environnement ramasse-miettes vous gérez les objets de base Foundation exactement comme vous le feriez dans un environnement compté référence (comme décrit dans le Guide de programmation de gestion de la mémoire pour Core Foundation> "Politique de propriété"). Si vous créez ou copiez un objet Foundation de base, vous devez le relâcher ultérieurement lorsque vous en avez terminé. Si vous souhaitez conserver un objet Foundation de base, vous devez le conserver et le relâcher lorsque vous en avez terminé.

+0

D'abord, merci pour votre réponse. Comment je devrais écrire la méthode finalize? ce code serait-il correct?: CGImageRelease (aLayer.content); aLayer = nil – Fernando

+0

Le contenu est conservé par le calque, vous pouvez donc le libérer immédiatement après l'affectation de aLayer.contents. Gardez à l'esprit que vous ne devriez pas utiliser un nom comme loadImage, mais plutôt createImage, comme vous possédez l'image qui est retournée (voir Guide de programmation de gestion de mémoire pour Core Foundation). –

+0

Merci! Je l'essaye. – Fernando

2

le garbage collector ne fonctionne avec les types CoreFoundation.

voir CFMakeCollectable (extrait de documents CF):

CFTypeRef CFMakeCollectable (CFTypeRef cf);

Rend un objet Foundation Core nouvellement alloué éligible pour la collecte .

Paramètres cf Objet CFType permettant de collecter . Cette valeur ne doit pas être NULL. Valeur de retour cf. Discussion Pour plus de détails, voir Guide de programmation de récupération de place.