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.

È stato utile?

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.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top