2011-03-30 4 views
1

je le code suivant:CGImage/UIImage fuite

... 

UIImage *image; 
CGImageRef imageRef; 

image = [[[UIImage alloc] initWithContentsOfFile: filePath] retain]; 

while (some_condition) 
{ 
    NSAutoreleasePool *pool = [[NSAutoReleasePool alloc] init]; 

    imageCGDATA = CGDataProviderCreateWithCFData(cfdata); 

    imageRef = CGImageCreate(width, height, bitsPerComponent, bitsPerPixel, bytesPerRow, colorSpace, bitmapInfo, imageCGDATA, NULL, NO, intent); 

    CGDataProviderRelease(imageCGDATA); 

    [image release]; 

    image = [[[UIImage alloc] initWithCGImage: imageRef]] retain]; // LEAK HERE 

    CGImageRelease(imageRef); 

    [pool release]; 
} 

... 

Quand je lance le code et regarde les allocations Je vois au total « Bytes Live » grandir en tant que chaque itération de la boucle est terminée, et le nombre de " CGImage "et" UIImage "Les allocations de vie deviennent très importantes (cela dépend évidemment du nombre d'itérations de la boucle).

Si je commente la ligne de code annotée avec "LEAK HERE" (et la version qui précède immédiatement cette ligne de code) et relancer l'application, alors "Live Bytes", nombre de "CGImage" et "UIImage" Les allocations de vie restent statiques sur de nombreuses itérations de la boucle.

Pourquoi ce code fuit-il? Qu'est-ce que je rate?

Merci.

Répondre

0

Vous n'avez pas besoin de retenir dans:

image = [[[UIImage alloc] initWithCGImage: imageRef]] retain];

Vous appelez alloc, de sorte que l'objet retourné a déjà un retainCount 1. retenir incrémente à nouveau l'retainCount-2, mais vous ne le relâchez qu'une seule fois avant de réaffecter le pointeur sur l'itération suivante de la boucle. Ainsi, une instance fuit parce que le retainCount a été laissé à 1.

Tant histoire courte, cela devrait corriger:

image = [[UIImage alloc] initWithCGImage: imageRef]];

+0

Merci! Je ne peux pas croire que j'ai raté ça - je suis nouveau à Objective-C et j'ai glissé tout droit dessus ... – JeffR