在 Zombies 工具下运行时的大型 CFString 分配,但不是泄漏或分配工具
Posted
技术标签:
【中文标题】在 Zombies 工具下运行时的大型 CFString 分配,但不是泄漏或分配工具【英文标题】:large CFString allocations when running under Zombies instrument but not leaks or allocations instrument 【发布时间】:2011-04-08 12:47:19 【问题描述】:我正在解决我的 iPad 应用程序中的一些内存分配问题,并且花了很长时间观察 CFString
在僵尸仪器下的成长和成长(作为一个仍然活着的物体),它是直到我切换到泄漏或分配工具,我注意到它根本没有增长(创建并仍然保持稳定),任何人都可以解释为什么这会发生在僵尸中而不是泄漏或分配工具中,这让我想知道CFString
是一个问题还是只是僵尸抛出的误报....
【问题讨论】:
您是指所有字符串还是仅指某个实例/字段? 应用程序中似乎无处不在的大量 CFStrings,这些是动态分配而不是泄漏 【参考方案1】:Zombies 专门不会释放内存,因此您可以在释放内存后查看您是否正在访问内存。使用僵尸时不能尝试检测泄漏。
在僵尸仪器下,您应该只是尝试检测僵尸。您的应用程序的其余行为不一定相同。为了最大限度地提高检测到僵尸访问的机会,可能会使用非标准分配器。
【讨论】:
我不确定这是否 100% 正确,我可以看到其他分配上升和下降,以及活动对象的数量上升和下降但 CFString 似乎失控,这是分配而不是泄漏 i我在看 CFString 使用自定义分配器——也许它们可以重用内存。如果是这样,不释放将导致更多的分配。此外,如果分配器可以共享用户不知道相同的实例(使用底层的引用计数),那么必须关闭它,否则您将无法检测到滥用。我怀疑这是预期的行为。 +1 @Matt 您看到的许多分配可能是通过 NSString api 分配的。 NSString 是 CFString - 你可以追踪最重的路径,或者你关心的路径(在 Instruments 中)。这些(NSStrings)不会被释放,并且像 Lou 所说的那样故意泄露。 Instruments 可以记录每个分配创建的调用堆栈以及每个引用计数操作。以上是关于在 Zombies 工具下运行时的大型 CFString 分配,但不是泄漏或分配工具的主要内容,如果未能解决你的问题,请参考以下文章