ios - 使用ARC实现堆积增长

时间:2013-07-19 16:46:57

标签: ios objective-c xcode memory-leaks abandoned-memory

每次运行一个更新数据和UI的方法时发现堆增长。 以下是我在Inspector中看到的内容: enter image description here 每次运行该方法时,堆大量增加大约1MB。几次调用应用程序崩溃后。

enter image description here

通过callstack向下发现这个静态函数: enter image description here

enter image description here

在代码中找不到任何内存泄漏。请帮忙。 (ARC开启)

更新

所以现在我在那个静态方法中使用了一个NSCalendar对象并且它有所帮助,但每次运行该方法时仍然 1MB enter image description here 现在,Inspector显示了许多与代码无关的内存地址。

enter image description here

3 个答案:

答案 0 :(得分:1)

您不需要创建这么多NSCalendars - 如果您重复使用autoupdatingCurrentCalendar(例如将其保存到GraphController ivar中)并将其传递给-dateDifferenceFromDate:to: ,您可以(虚拟地)消除日历创建。

更新

  

这可以帮助废弃的记忆,或者它只会提高速度吗?

了解此建议有多大帮助的最佳方法是衡量。您的屏幕截图表明ICU时区(由日历使用)创建为最重的部分。 IDK在绘制图形时多少次调用它(即您创建了多少NSCalendars,或者实现是否通过此API共享/缓存信息)...但是您提供的信息让我相信它是'很多' - 这是-dateDifferenceFromDate:to:每次通话的一个日历。

所以是的,它可以消除(不必要的)重复对象 - [NSCalendar currentCalendar]不返回单例(你的样本证明了这一点)。

另请注意,NSDateComponents可能会引用日历实例。

创建日历可能非常耗时(不仅仅是内存)。

另请注意,NSCalendar 线程安全。

所以你的程序可能会产生很多不必要的临时工。大多数(如果不是全部)内存将“很快”发布,但如果您需要大量“计算”,那么您的自动释放池中可能会有大量存款(最终会耗尽)。您可以创建内部自动释放池来减少这种情况,但使用一个日历可以轻松优化速度和内存。

许多系统API在幕后缓存并导致令人惊讶的内存增长,但IDK是否是其中之一。

此博文可能也很有趣:http://www.mikeabdullah.net/NSCalendar_currentCalendar.html

但实际上,我只是尝试使用单个自动更新日历,然后进行衡量。然后,您将知道它对您的实施有多大帮助。

答案 1 :(得分:0)

内存“泄漏”不是导致崩溃的原因。显然,ARC回收了内存。你能告诉我们这次事故吗?

答案 2 :(得分:0)

问题不在于dateFormatter。这是它的容器额外保留。出于某种原因,我在控制器上调用 setParentView

有帮助的答案: https://stackoverflow.com/a/17767593/1974008