NSImage и связанные с ними API, протекающие память

StackOverflow https://stackoverflow.com/questions/3425145

  •  26-09-2019
  •  | 
  •  

Вопрос

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

 // 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 МБ памяти каждый раз, когда выполняется этот фрагмент кода. Я не уверен, где это ошибка.

Это было полезно?

Решение

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top