2010-08-06 4 views
0

trouverez ci-dessous l'extrait de code que j'ai:NSImage et les API connexes fuite de mémoire

// Make Auto release pool 
NSAutoreleasePool * autoReleasePool = [[NSAutoreleasePool alloc] init]; 
try 
{ 
    if (mCapture) 
    { 
    // Get the image reference 
    NSImage* image = NULL; 
    image = [mCapture getCurrentFrameImage]; 

    // Get the TIFF data 
    NSData *pDataTifData = [[NSData alloc] initWithData:[image TIFFRepresentation]]; 
    NSBitmapImageRep *pBitmapImageRep = [[NSBitmapImageRep alloc] initWithData:pDataTifData]; 

    // Convert to BMP data 
    NSData *pDataBMPData; 
    pDataBMPData = [pBitmapImageRep representationUsingType: NSPNGFileType 
       properties: nil]; 

    // Save to specified path 
    ASL::String strPath = ASL::MakeString(capInfo->thefile.name); 
    NSString* pPath = (NSString*)ASL::MakeCFString(strPath); 
    [pDataBMPData writeToFile:pPath 
     atomically: YES]; 

    ::CFRelease(pPath); 
    pDataBMPData = nil; 

    [pBitmapImageRep release]; 
    pBitmapImageRep = nil; 
    [pDataTifData release]; 
    pDataTifData = nil; 

    image = nil; 
    } 
} 
catch(...) 
{ 
} 
[autoReleasePool drain]; 

Notez que image = [mCapture getCurrentFrameImage]; est un autoreleased NSImage retournaient. Je libère des objets et ai également NSAutoreleasePool en place. Mais encore, il fuit environ 3-4 Mo de mémoire chaque fois que cet extrait de code est exécuté. Je ne suis pas sûr où est l'erreur.

+0

'TIFFRepresentation' renvoie un objet NSData. Pourquoi en créez-vous un autre? De même, 'getCurrentFrameImage' ne devrait pas utiliser le mot' get', qui est pour les méthodes qui retournent quelque chose par référence; Je suggère quelque chose comme 'captureCurrentFrameImage'. –

Répondre

1

Vous pouvez simplifier ce code beaucoup en faisant captureCurrentFrameImage retourner un NSBitmapImageRep au lieu d'un NSImage, puisque vous n'utilisez jamais un NSImage ici. Vous pouvez envelopper l'image rep dans une image si nécessaire, et pour ce code, utilisez simplement l'image rep par elle-même pour produire les données PNG. Entre autres choses, cela vous évite un voyage à travers la représentation TIFF.

S'il continue de fuir après avoir apporté ces modifications, exécutez votre application sous le modèle Fuites d'instruments; Les deux instruments de ce modèle, Leaks et ObjectAlloc, vous aideront à traquer toutes les fuites que vous avez.

+0

J'ai déjà essayé avec des instruments avec des outils ObjectAlloc et Memleak. Ils ne montrent aucune fuite pendant que ce code est exécuté mais montrent des pics de 3-4 Mo d'augmentation des allocations de mémoire. Tous ces pics pointent vers ce code mais aucune fuite de mémoire n'est montrée par l'outil. c'est pourquoi je suis à perte ici car chaque fois que ce code est exécuté, la mémoire de 3 Mo est consommée mais toujours pas la fuite de mémoire est montrée par des instruments. [[NSBitmapImageRep alloc] initWithData: pDataTifData]; déclaration semble être coupable, mais encore une fois je ne suis pas en mesure de trouver un moyen de libérer la mémoire. – Sandeep

+0

L'exécution des simplifications que j'ai suggérées dans ma réponse réduira l'utilisation de la mémoire de votre application, puisque vous allez créer moins d'objets. Est-ce que l'utilisation de la mémoire continue d'augmenter et de monter, ou monte-t-elle, puis redescend? –

+0

J'ai supprimé le code Tiff et utilisé le CVImageBuffer à la place. Mais encore il fuit (autant que je pense contrairement aux Instruments) dans la création de NSBitmapImageRep. Instruments montre de nombreux blocs alloués en mémoire à cette instruction qui est encore en vie et c'est 5 Mo dans mon cas. – Sandeep