我一直在ARC项目上使用Instruments(在设备上运行)以确保我清理任何废弃的内存。为此,我一直在使用分配生成工具并将我的堆的快照用于相同的操作10-20次。令我困惑的是增长。有些时候增长是0,然后是另一个,一些字节数(从几个字节到几千字节之间从不一致)似乎正在积累。但通常至少有几次迭代增长为0。
我的问题是:如果我的成长有时为0,这是否意味着我的记忆管理是正确的?或者我仍然有需要发现的问题吗?我知道内存可能需要几个周期来“消耗”,但是即使在> 10次迭代之后仍然分配并保留的内存呢?
这似乎是关于乐器解释的更普遍的问题,所以我遗漏了任何具体的代码。此外,我发现这种情况发生在各种堆快照场景中:拉动刷新,推送视图控制器等等。
答案 0 :(得分:3)
我想说,如果你的动作循环有几次迭代导致分配了0个字节并且仍然存在,那么你就很好地进行内存管理并且没有泄漏。
您所看到的增加(从几个字节到几千字节)最有可能来自操作系统或后台Apple代码,以尝试管理您正在执行的任务。一个简单的例子是,如果你第一次拿起键盘Apple为它分配永不释放的内存,那么迭代就会看到你没有创建的“泄露”内存。你所做的一切都有Apple运行的背景代码,你无法定义它想要用内存做什么。它可以缓存经常完成的特定事情,以便下次运行得更快。整个Apple的理念是流畅运行的应用程序,因此用户体验是最好的。操作系统在后台执行的操作可能是间歇性的,并且可能导致未释放的内存。
检查堆快照以查找已分配但未释放的对象。如果你可以跟踪代码中的那些对象然后修复它,如果你不能,那么它可能是一个可以或不可以避免的操作系统分配。就像我刚才说的那样,如果你获得了大量的0增加,那么由于这些间歇性的OS增加,我不会担心它。