使用垃圾收集时,新创建的Cocoa应用程序中的内存泄漏?

时间:2008-12-12 21:17:51

标签: objective-c cocoa memory-leaks garbage-collection

我决定将GC用于我最新的Cocoa项目的内存管理,我发现了一些有趣的东西 - 如果我在Xcode中创建一个全新的Cocoa应用程序项目,将GC转换为支持或必需(我试过两者),构建,并运行它泄漏,它显示内存泄漏!

NSCFData,GeneralBlock,CGEvent,CFDictionary,CGSRegion等类型的大量微小漏洞泄露

重现的步骤:

  1. 文件 - >新项目 - > Cocoa app
  2. 项目 - >编辑项目设置 - > GC必需(或支持,任一个)
  3. 建设 - >生成
  4. 运行 - >使用效果工具运行 - >泄漏
  5. 等待泄漏检测触发(我将其设置为10秒,默认为30)
  6. 80%的时间我都会泄漏大约2-20 Kb的上述各类物品。

    其他人是否有同样的行为?


    编辑:我通过重命名InputManagers文件夹来测试以下情况(此时日志消息消失了,所以它们肯定不再被加载)并且仍然会出现内存泄漏。所以它似乎与它有任何关系。我将文字留在那里,所以Ashley Clark的回答仍然有意义。

    我知道的唯一奇怪的情况是,如果我在启用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的原始安装上是否发生同样的事情。

2 个答案:

答案 0 :(得分:5)

leaks工具在Leopard中的Objective-C垃圾收集下不准确,因为它对垃圾收集器的运行时结构知之甚少,无法真正确定哪些对象仍存在但已准备就绪回收

另外,你对leaks的结果的解释有点误:看起来像泄漏的来自 NSCFData,CGEvent等等 - 那些< em>是所谓的泄露对象。

如果您认为特定对象在Objective-C垃圾回收下过长时间,那么GDB中的info gc-referencesinfo gc-roots命令就是您要使用的命令。 Bill Bumgarner在this post to Cocoa-Dev的GC下讨论了它们以及“泄漏”的一般概念。

答案 1 :(得分:1)

这些日志消息告诉您Inquisitor.bundle和SaftLoader.bundle不是为在GC程序下运行而构建的,因此不会被加载。虽然它们可能只适用于Safari,但它们是输入管理器,这意味着每个 Cocoa应用程序都会尝试在启动时加载它们,因此不正确编写的输入管理器可能会导致很多问题。

我怀疑他们对你所看到的内容负责,但是如果你想在没有它们的情况下进行测试,只需在运行测试之前重命名InputManagers文件夹,它们将被忽略。

你在哪里看到这些泄漏?