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 MBのメモリが漏れています。間違いがどこにあるのかわかりません。
解決
このコードを作成することで、このコードを大幅に簡素化できます captureCurrentFrameImage
ここでは何でもnsimageを実際に使用しないため、nsimageの代わりにnsbitmapimagerepを返してください。必要に応じて画像担当者を画像にラップすることができます。このコードでは、画像担当者を単独で使用してPNGデータを作成できます。とりわけ、これによりTIFF表現を介して旅行を節約できます。
それらの変更を行った後も漏れている場合は、Instrumentsのリークテンプレートの下でアプリを実行してください。そのテンプレートの2つの楽器であるリークとObjectAllocは、あなたが持っているあらゆる漏れを追い詰めるのに役立ちます。
所属していません StackOverflow