0

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

 // 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〜4MBのメモリがリークしています。どこに間違いがあるのか​​わかりません。

4

1 に答える 1

1

captureCurrentFrameImageここでは実際にNSImageを使用することはないため、NSImageの代わりにNSBitmapImageRepを返すことで、このコードを大幅に簡略化できます。必要に応じて画像担当者を画像でラップできます。このコードでは、画像担当者を単独で使用してPNGデータを生成します。特に、これによりTIFF表現を使用する手間が省けます。

これらの変更を行ってもリークが発生する場合は、Instrumentsのリークテンプレートでアプリを実行します。そのテンプレートの2つの機器、LeaksとObjectAllocは、リークが発生した場合にそれを追跡するのに役立ちます。

于 2010-08-06T23:16:02.327 に答える