我决定将GC用于我最新的Cocoa项目的内存管理,我发现了一些有趣的东西 - 如果我在Xcode中创建一个全新的Cocoa应用程序项目,将GC转换为支持或必需(我试过两者),构建,并运行它泄漏,它显示内存泄漏!
NSCFData,GeneralBlock,CGEvent,CFDictionary,CGSRegion等类型的大量微小漏洞泄露
重现的步骤:
80%的时间我都会泄漏大约2-20 Kb的上述各类物品。
其他人是否有同样的行为?
我知道的唯一奇怪的情况是,如果我在启用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与Dev工具来测试在没有SAFT或Inquisitor的原始安装上是否发生同样的事情。
答案 0 :(得分:5)
leaks
工具在Leopard中的Objective-C垃圾收集下不准确,因为它对垃圾收集器的运行时结构知之甚少,无法真正确定哪些对象仍存在但已准备就绪回收
另外,你对leaks
的结果的解释有点误:看起来像泄漏的来自 NSCFData,CGEvent等等 - 那些< em>是所谓的泄露对象。
如果您认为特定对象在Objective-C垃圾回收下过长时间,那么GDB中的info gc-references
和info gc-roots
命令就是您要使用的命令。 Bill Bumgarner在this post to Cocoa-Dev的GC下讨论了它们以及“泄漏”的一般概念。
答案 1 :(得分:1)
这些日志消息告诉您Inquisitor.bundle和SaftLoader.bundle不是为在GC程序下运行而构建的,因此不会被加载。虽然它们可能只适用于Safari,但它们是输入管理器,这意味着每个 Cocoa应用程序都会尝试在启动时加载它们,因此不正确编写的输入管理器可能会导致很多问题。
我怀疑他们对你所看到的内容负责,但是如果你想在没有它们的情况下进行测试,只需在运行测试之前重命名InputManagers文件夹,它们将被忽略。
你在哪里看到这些泄漏?