4

我以前没有使用过 Zombies,并且必须承认我不确定它在做什么。但是,我担心一件事:

CFArray 似乎在不断增加它的 Live Bytes 和 # Living 列,以及一些我认为是相关的 malloc。这是我的应用程序只是坐在那里,渲染(OpenGL)并等待输入的时候。

我已经尝试运行泄漏工具,但这并没有表明我在此期间发生了内存泄漏,甚至没有更多的分配。没有任何分配,更不用说CFArray了。

那么我应该相信这两种工具中的哪一种呢?或者只是我不明白僵尸仪器实际上在做什么?

如果有任何关于 Zombies 的像样的文档可供任何人指出,那就太酷了。苹果的文档似乎掩盖了一点。

4

2 回答 2

6

NSZombies 基本上用占位符替换已释放的对象,以通知开发人员是否在 dealloc 之后访问了它(显然是一件坏事)。这有助于解决保留/释放问题。

通过打开它,您的应用程序将看起来像是像筛子一样泄漏内存,因为没有任何东西会真正被释放。通常,我在调试期间使用 NSZombies 来查找特定的崩溃程序(或者您可以在 Allocations 工具中打开 Zombies - 这也应该警告您内存使用量只会上升)...我使用 Leaks 或 Allocations w/Heap Shots对正常运行的应用程序进行内存分析的工具。

关于 SO 的另一个好问题/答案:什么是 NSZombie?

于 2011-02-02T22:53:22.173 回答
2

启用僵尸会看到 objc 实例在其保留计数达到 0 时未被释放(通常,此时会调用 dealloc 并释放对象的内存)。具体来说,将调用 dealloc,但不会释放对象,并且引用计数将可供以后使用。

当然,还有更多,这是一个实现细节:在消息传递系统的某个地方,系统会检查您是否没有向僵尸发送消息(僵尸是一个保留计数为 0 的对象)。如果您向僵尸发送消息,那么系统会为您检测到这一点(正如您在启用僵尸运行时可能遇到的那样)。

于 2011-02-02T22:56:11.443 回答