NSIMAGE E API correlate che perde la memoria
Domanda
Di seguito è riportato il frammento di codice che ho:
// 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];
Notare che image = [mCapture getCurrentFrameImage];
sta restituendo un autorizzato NSImage
. Sto rilasciando oggetti e lo ho anche NSAutoreleasePool
a posto. Ma comunque perde circa 3-4 MB di memoria ogni volta che viene eseguito questo frammento di codice. Non sono sicuro di dove sia l'errore.
Soluzione
Potresti semplificare molto questo codice facendo captureCurrentFrameImage
Restituisce un NSBitMapimagERep anziché un nsimage, dal momento che non si usa mai un nsimage per nulla qui. È possibile avvolgere il rappresentante dell'immagine in un'immagine quando necessario e, per questo codice, utilizzare semplicemente il rappresentante dell'immagine da solo per produrre i dati PNG. Tra le altre cose, questo ti fa risparmiare un viaggio attraverso la rappresentazione del TIFF.
Se perde ancora dopo aver apportato tali modifiche, eseguire l'app sotto il modello di perdite di Strumenti; I due strumenti in quel modello, perdite e obmeilalloc, ti aiuteranno a dare la caccia a qualunque perdita tu abbia.