很难解释我在主题行中需要什么。如果您有更好的想法,请随时编辑它。
问题如下:
iOS应用程序一次只能处理一个文档。每次关闭文档并打开一个新文档时,即使它是同一个文档,内存使用量也会不断增加,并且总是以相同的数量增加。
所以有泄漏。代码不会释放(释放)某些东西。也许它是一个数组,它添加对文档项的引用,并且永远不会被清除,尽管它应该。
当然,泄漏工具在这里没有帮助,因为它都是“正确的”(它只能找到没有所有者的分配)。
如何使用Instruments(或dtrace)现在找到这个bugger?如果我可以简单地在仪器中识别其中一个未添加的对象,那将会有所帮助,其余的将很容易。
到目前为止,我一直在使用Allocations工具,将检查范围设置为旧文档关闭和新文档打开时的时间。尽管如此,这显示了数以千计的对象,其中只有一个是从前一个文档遗留下来的对象,尽管它不应该仍然存在。我需要识别的那个对象。
我想我需要的是分配工具中的一项功能减去刚刚添加的所有分配,并且还减去启动后存在的所有分配 - 剩下的是新文档创建的项目但是从那以后没有被释放。有没有办法获取收集的对象集合,将它们分组并设置这样的操作?可能不是。
每次打开文档时都会创建大约20000个对象,并且涉及大约50个源文件,通过查看源代码或手动检查所有对象,这是不可行的。
哦,静态分析仪也无济于事。
答案 0 :(得分:8)
我想我明白了:
秘诀在于正确使用 Mark Heap 按钮:
到目前为止,我只在加载新文档之前和之后尝试过一次。
但是当我三次次(加载,快照,加载,快照,加载,快照)时,中间的Heapshot将列出两个doc加载之间仍然存活的对象在它周围,这正是我想要的。
答案 1 :(得分:3)
我原本认为仪器工具是理想的,只需跟踪分配(不仅仅是泄漏),打开/关闭一些文件来查看这些分配......最后点击仍然分配的区域,看看是什么仍然被分配,可能会允许你处理“分配树”以找到仍然需要释放的任何根对象。
我意识到你可能已经知道了这一点,但是为了新手阅读本文的好处,如果你正在做这种方法,请确保NSZombies被禁用,否则一切都将显示为我相信的分配。 快乐的小虫挤压......