NSImage и связанные с ними API, протекающие память
Вопрос
Ниже приведен липчик кода, который у меня есть:
// 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, помогут вам охотиться на любые утечки у вас.