NSImage и связанные API утечки памяти - PullRequest
0 голосов
/ 06 августа 2010

Ниже приведен фрагмент кода, который у меня есть:

 // 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];

Обратите внимание, что image = [mCapture getCurrentFrameImage]; возвращает автоматически выпущенный NSImage. Я освобождаю объекты, и у меня есть NSAutoreleasePool. Но при этом каждый фрагмент кода теряет 3-4 МБ памяти. Я не уверен, где ошибка.

1 Ответ

1 голос
/ 07 августа 2010

Вы могли бы значительно упростить этот код, заставив captureCurrentFrameImage возвращать NSBitmapImageRep вместо NSImage, так как вы фактически никогда не используете NSImage для чего-либо здесь.Вы можете обернуть изображение представителя в изображение, когда это необходимо, и для этого кода просто используйте изображение представителя само по себе для получения данных PNG.Помимо всего прочего, это избавит вас от необходимости проходить через представление TIFF.

Если после внесения этих изменений все равно возникает утечка, запустите приложение под шаблоном «Утечки инструмента»;Два инструмента в этом шаблоне, Leaks и ObjectAlloc, помогут вам выследить любые утечки.

...