iOS ARC ram只能成长

时间:2013-12-22 01:41:41

标签: ios iphone automatic-ref-counting ram

您好我的问题可能是一般我不是要求代码等 我只为iOS6.1及以上版本的iPhone开发

当我运行我的应用程序时,它使用的RAM只会增长(当我在视图之间切换时(我有15个视图))。

然而,在我使用分析仪进行测试后,它没有发现任何泄漏。 仪器泄漏也没有发现泄漏。

尽管我的应用程序不超过20 MB的内存,但我仍然担心某些事情可能不合适。

我正在使用ARC,但是ram仍在使用。

我有什么方法可以检查可能导致单面ram分配的原因吗?

1 个答案:

答案 0 :(得分:6)

如果记忆继续上升,它可能是各种不同的东西,但“强参考周期”是主要的嫌疑人。遗憾的是,这不一定会出现在仪器的Leaks工具中。

在分配工具中执行快照/生成并确定未发布的内容(特别是如果它包含任何类)并从那里开始。具体来说,按照其步调运行应用程序,然后标记快照/生成,执行更多操作,然后标记另一个快照/生成。查看第二个快照,查看自上一个快照以来捕获的内容(但未发布),重点关注您的类。你会很快找到罪魁祸首。

有关实际演示,请参阅WWDC视频iOS App Performance: Memory


例如,这是一个健康的应用程序,我通过仪器的“泄漏”工具进行了分析,但我将专注于“分配”工具:

good

在这个配置文件中,我等待应用程序安静下来,点击“Mark Generation”按钮(产生“Generation A”,我的时间轴中的第一个标志)。然后我去了一个观点,然后解散了它,再次做了“Mark Generation”,得到了“B代”。 “增长”专栏告诉我,在A代和B代之间,消耗了100kb,但没有发布。但我并不担心这个问题,因为UIKit元素可能会有一些iOS内部缓存。所以,我再一次重复这个过程来获得“C代”。现在这很有趣,现在报告的增长率仅为8.26kb,这可以忽略不计。这与Leaks仪器的清洁健康状况相结合,让我对任何严重记忆问题的风险感到非常满意。

现在,让我们将一些代码与一个存在严重问题的“强参考周期”进行对比:

strong reference cycle

现在这是完全不同的画面,即使这个过程是相同的“现在和解雇”过程,重复两次。现在告诉我,我的世代之间增长了14mb,更值得注意的是,我可以清楚地看到有问题的增长曲线。值得注意的是,虽然Allocations工具显然正在解决一个严重问题,但Leaks工具却没有报告任何内容。

现在,实际上,使用Allocations工具的实际经验可能会介于这两个极端之间。您的应用可能有自己的缓存或模型对象慢慢占用内存,但如果您正确响应内存警告,您应该恢复该内存。但坦率地说,大多数设计良好的应用程序根本不应该生成内存警告(通常通过正确配置缓存,在适当的情况下避免imageNamed,移动到大型或不经常访问的数据的持久存储等来实现)。目标是达到应用程序稳定在某个合理的基线内存分配水平附近的点,始终返回到该基线。

但是,在您对应用程序进行基本概要分析并诊断出您遇到的各种内存问题之前,我们无法为您提供建议。