NSIMAGE y API relacionadas con filtración de memoria
Pregunta
El siguiente es el fragmento de código que tengo:
// 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];
Tenga en cuenta que image = [mCapture getCurrentFrameImage];
está devolviendo un autorelato NSImage
. Estoy lanzando objetos y también tengo NSAutoreleasePool
en su lugar. Pero aún así está goteando alrededor de 3-4 MB de memoria cada vez que se ejecuta este fragmento de código. No estoy seguro de dónde está el error.
Solución
Podrías simplificar mucho este código haciendo captureCurrentFrameImage
Devuelve un NSBITMapimageP en lugar de una NSIMAGE, ya que en realidad nunca usas una NSIMAGE para nada aquí. Puede envolver el representante de la imagen en una imagen cuando sea necesario, y para este código, simplemente use el representante de imagen por sí solo para producir los datos de PNG. Entre otras cosas, esto le ahorra un viaje a través de la representación de TIFF.
Si aún se filtra después de realizar esos cambios, ejecute su aplicación en la plantilla de filtraciones de Instruments; Los dos instrumentos en esa plantilla, fugas y objetalloc, lo ayudarán a cazar las filtraciones que tenga.