我决定将GC用于我最新的Cocoa项目的内存管理,我发现了一些有趣的东西 - 如果我在Xcode中创建一个全新的Cocoa应用程序项目,将GC转换为支持或需要(我尝试了两者),构建和运行它泄漏,它显示内存泄漏!
大多数NSCFData,GeneralBlock,CGEvent,CFDictionary,CGSRegion等类型的微小漏洞.
重现步骤:
文件 - >新项目 - > Cocoa app
项目 - >编辑项目设置 - > GC必需(或支持,任一个)
建设 - >构建
运行 - >运行性能工具 - >泄漏
等待泄漏检测触发(我将其设置为10秒,默认为30)
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的原始安装上是否发生同样的事情.
leaks
在Leopard中的Objective-C垃圾收集下,该工具不准确,因为它对垃圾收集器的运行时结构知之甚少,无法实际确定哪些对象仍然存在但已准备好回收.
另外,你在解释结果时有点误会leaks
:看起来像泄漏的东西不是来自 NSCFData,CGEvent等等 - 那些是假定泄露的对象.
如果您认为特定对象在Objective-C垃圾收集下过长时间,那么GDB中的info gc-references
和info gc-roots
命令就是您要使用的.Bill Bumgarner在这篇文章中向Cocoa-Dev讨论了它们以及GC下"泄漏"的一般概念.