gpt4 book ai didi

ios - 使用 ARC 的堆增长

转载 作者:塔克拉玛干 更新时间:2023-11-02 21:41:55 27 4
gpt4 key购买 nike

每次运行一种更新数据和 UI 的方法时都会发现堆增长。这是我在 Inspector 中看到的内容: enter image description here每次运行该方法时,堆都会有大约 1MB 的巨大增长。几次通话后应用程序崩溃。

enter image description here

通过调用堆栈向下找到这个静态函数: enter image description here

enter image description here

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

更新:

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

enter image description here

最佳答案

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

更新

Can this help with abandoned memory or it's only improves speed?

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

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

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

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

另请注意,NSCalendar 不是线程安全的。

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

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

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

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

关于ios - 使用 ARC 的堆增长,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17751399/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com