当我使用 XCode 4.5 创建一个全新的 Cocoa (Mac OS X) 应用程序时,关闭“基于文档”选项并打开“自动引用计数”,构建,无需更改任何内容,并使用“泄漏”使用 Profiler 运行模板,我看到 19.76 兆的临时内存使用量,以及 2.23 兆字节的“活动字节”,包括 3132 个 CFStrings、1371 个 CFBasicHash 和几百个奇数 mallocs(),其中包括 192 kb 仍由 CoreGraphics 分配,即使程序终止。我在“分配”时间轴中看到了所有这些,但在“泄漏”时间轴中没有输出。我发现这种差异令人困惑。
例如,我想知道一个简单的 Cocoa 基础参考应用程序,如果可能,如果没有,那么我想知道参考技术是什么,以了解哪些泄漏是我的,哪些是预期的。
请注意,使用 Foundation-framework 链接的命令行工具,“开箱即用泄漏”的数量要简单得多,只有大约 18 个 mallocs(),总共 1.06 kb,所以看起来 AppKit (Cocoa) 是大多数默认的“在程序结束时仍在堆上的活动对象,不知何故,没有泄漏”。
是否有某种方法可以制作一个简单的不泄漏 Cocoa 基础参考应用程序,或者框架本身是否泄漏太多(可能是故意的)以至于事实上这是不可能的?
是的,我知道静态分析。是的,我知道垃圾收集。如果有人不想使用垃圾收集,而只使用 ARC,并且想在运行时真正查看泄漏了什么,那么该人可以这样做,而不必忽略基础和框架中的 14799 左右泄漏吗?
更新:正如建议的那样,我自己的困惑的来源#1是我正在查看错误的时间线......但是,在我自己的辩护中(或解释我的困惑),我一直考虑仍然分配的任何对象在程序执行结束时的堆上作为泄漏,这是在 Pascal (Delphi) 和 C++ 世界中普遍观察到的规则,实际上在 Linux 和 Windows 上的大多数非垃圾收集语言中也是如此。也许这根本不是 Objective-C 世界中的“泄漏”?内存时间轴中的“活动项目”是否仍然“在堆上处于活动状态”,这与泄漏有什么不同?我的 AppController 从未被告知“dealloc”这一事实也让我感到惊讶,但有人告诉我,这是“意料之中的”。