我决定将 GC 用于我最新的 Cocoa 项目的内存管理,我发现了一些有趣的东西——如果我在 Xcode 中创建一个全新的 Cocoa 应用程序项目,将 GC 设置为支持或必需(我都尝试过),构建并运行它泄漏,它显示内存泄漏!
主要是 NSCFData、GeneralBlock、CGEvent、CFDictionary、CGSRegion 等类型的对象的大量微小泄漏。
重现步骤:
- 文件->新建项目->Cocoa应用
- 项目->编辑项目设置->GC 必需(或支持,任一)
- 构建->构建
- 运行->使用性能工具运行->泄漏
- 等待泄漏检测触发(我将其设置为 10 秒,默认为 30)
大约 80% 的时间我会泄漏大约 2-20 Kb 的上述各种对象。
其他人有同样的行为吗?
编辑:我通过重命名 InputManagers 文件夹测试了以下情况(此时日志消息消失了,所以它们肯定不再被加载)并且仍然出现内存泄漏。因此,这似乎与它无关。我把文字留在那里,所以阿什利克拉克的回答仍然有意义。
我知道的唯一奇怪的情况是,每当我运行启用了 GC 的应用程序时,我都会在控制台中收到以下消息:
2008-12-12 13:03:09.829 MemLeakTest[41819:813] Error loading /Library/InputManagers/Inquisitor/Inquisitor.bundle/Contents/MacOS/Inquisitor: dlopen(/Library/InputManagers/Inquisitor/Inquisitor.bundle/Contents/MacOS/Inquisitor, 265): no suitable image found. Did find:
/Library/InputManagers/Inquisitor/Inquisitor.bundle/Contents/MacOS/Inquisitor: GC capability mismatch
2008-12-12 13:03:09.840 MemLeakTest[41819:813] Error loading /Library/InputManagers/Saft/SaftLoader.bundle/Contents/MacOS/SaftLoader: dlopen(/Library/InputManagers/Saft/SaftLoader.bundle/Contents/MacOS/SaftLoader, 265): no suitable image found. Did find:
/Library/InputManagers/Saft/SaftLoader.bundle/Contents/MacOS/SaftLoader: GC capability mismatch
我猜这与这两个插件试图加载到每个启动的程序中有关,而不仅仅是 Safari(它们是它们的插件)。我不确定这是否与此有关,但这似乎绝对是一种可能性。我无法方便地使用带有开发工具的干净而不是 OS X 10.5 来测试在没有 SAFT 或 Inquisitor 的原始安装上是否会发生同样的事情。