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.

¿Fue útil?

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.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top