每次运行一个更新数据和UI的方法时发现堆增长。 以下是我在Inspector中看到的内容: 每次运行该方法时,堆大量增加大约1MB。几次调用应用程序崩溃后。
通过callstack向下发现这个静态函数:
在代码中找不到任何内存泄漏。请帮忙。 (ARC开启)
更新
所以现在我在那个静态方法中使用了一个NSCalendar对象并且它有所帮助,但每次运行该方法时仍然 1MB 。 现在,Inspector显示了许多与代码无关的内存地址。
答案 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 。