【问题标题】:NSImage and related APIs leaking memoryNSImage 和相关 API 泄​​漏内存
【发布时间】:2010-08-06 15:15:21
【问题描述】:

以下是我拥有的代码 sn-p:

 // 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。但每次执行此代码 sn-p 时,它仍然会泄漏大约 3-4 MB 的内存。我不确定错误在哪里。

【问题讨论】:

  • TIFFRepresentation 返回一个 NSData 对象。你为什么要从中创造另一个?此外,getCurrentFrameImage 不应该使用单词get,它用于通过引用返回某些内容的方法;我建议像captureCurrentFrameImage

标签: macos cocoa nsimage


【解决方案1】:

你可以通过让captureCurrentFrameImage 返回一个 NSBitmapImageRep 而不是 NSImage 来大大简化这段代码,因为你在这里从来没有真正使用过 NSImage。您可以在必要时将图像代表包装在图像中,对于此代码,只需使用图像代表本身来生成 PNG 数据。除其他外,这可以节省您通过 TIFF 表示的时间。

如果在您进行这些更改后仍然泄漏,请在 Instruments 的 Leaks 模板下运行您的应用;该模板中的两个工具 Leaks 和 ObjectAlloc 将帮助您找到任何泄漏。

【讨论】:

  • 我已经尝试过使用带有 ObjectAlloc 和 Memleak 工具的工具。它们在执行此代码时没有显示任何泄漏,但显示内存分配增加了 3-4 MB 的峰值。所有这些峰值都指向此代码,但该工具未显示内存泄漏。这就是为什么我在这里不知所措,因为每次执行此代码时,都会消耗 3 MB 内存,但 Instruments 仍然没有显示内存泄漏。 [[NSBitmapImageRep alloc] initWithData:pDataTifData];声明似乎是罪魁祸首,但我还是找不到任何释放内存的方法。
  • 执行我在回答中建议的简化将减少应用程序的内存使用量,因为您将创建更少的对象。内存使用量是不断上升,上升再上升,还是上升然后下降?
  • 我已删除 Tiff 代码并改用 CVImageBuffer。但它仍然在 NSBitmapImageRep 创建中泄漏(我认为与 Instruments 不同)。 Instruments 在这条语句中显示了许多内存分配的块仍然存在,在我的例子中是 5MB。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-06-14
  • 1970-01-01
  • 1970-01-01
  • 2013-01-25
  • 1970-01-01
  • 2010-11-19
  • 2013-09-27
相关资源
最近更新 更多