分配工具的不同行为(有和没有僵尸模式)

时间:2011-07-02 14:27:39

标签: ios monitoring instruments xcode-instruments allocation

我真的很难在iOS中进行内存管理,或者更精确地监控复杂的内存使用情况。

所以实际上我想知道一次在Zombie-Mode中提供的分配工具(当我正在寻找僵尸时)和一般的“正常”分配工具(可以从Memory-> Allocations中选择)。

如果我正在搜索Zombies,分配工具会向我显示当前分配的完全不同数量的存储(实时字节数)。每次点击我的UI时,实时字节都会增加很多。

但是在正常分配窗口(内存 - >分配)中,一切似乎(几乎绝对)都很好。因此,分配了1,13 MB的实时字节,但这是分配字节的最大值,与上面的描述形成对比,我可以通过点击UI来达到4-5 MB。所以对我来说这似乎很奇怪。

Zombies中是否还有其他值?>正常分配窗口中没有考虑的分配?

注意:我的程序中没有僵尸和泄漏。

1 个答案:

答案 0 :(得分:2)

据我了解Zombies功能,它被视为与仪器中的泄漏和对象分配互斥。

事实上,当你启用僵尸(Instruments或NSZombies指令)时,会发生什么事情是欺骗对象的“正常”保留周期,以便您可以检测使用已经解除分配的对象的尝试。在某种意义上,我不知道有关它的细节,但是就像保留计数增加1,并且当保留计数变为1时,您得到关于尝试使用已经解除分配的实例的错误实际上,如果保留计数可以归零,则对象将被释放,并且在大多数情况下将无法检测到重用的尝试,因为它可能在解除分配后很长一段时间内发生并且可能已经存在大块内存重新分配给其他一些对象。因此,保留计数的人工增量将有助于使对象在“将”释放时存活下来;当保留计数变为1时,在对象中设置一个标志,以便运行时知道它正在尝试向“将要”解除分配的对象发送消息,并且您将收到完整的错误消息。

这只是我的心理模型,但它允许我解释为什么在启用僵尸时内存分配要高得多(即,因为对象没有按正常情况解除分配)。