質問

以下は、私が持っているコードスニペットです。

 // 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は、あなたが持っているあらゆる漏れを追い詰めるのに役立ちます。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top