【问题标题】:iOS Memory usage keep increasingiOS 内存使用量不断增加
【发布时间】:2014-08-01 22:07:34
【问题描述】:

我是 iOS 开发新手。

我正在构建一个简单的公交时刻表应用程序,它发出 HTTP 请求、解析 XML 并显示/保存数据。我有四个表视图控制器和两个视图控制器。 当我启动应用程序时,Xcode 内存报告告诉我它的内存使用量约为 18MB,这很奇怪,因为它只是一个简单的应用程序。我在应用商店查看过类似的应用,但它们都小于 10MB。由于它是一个公交时刻表应用程序,我让它每 30 秒发出一次新请求以更新时间。我注意到每次我更改视图以查看另一个时间表时,内存使用量都会增加,并且可能会达到 50MB 或更多。

我查看了 Xcode 的仪器,看起来没有泄漏。我还查看了分配情况,看起来每次切换视图时活动字节都在不断增加。

我有点不知道从这里做什么。有人可以指导我吗?提前致谢。

【问题讨论】:

  • 呃,这不是关于编程的吗?
  • "我在应用商店中查看过类似的应用,但它们都小于 10MB"。您是如何分析应用商店中的其他应用的?

标签: ios objective-c memory-management


【解决方案1】:

使用 Heapshot 查找内存蠕变。 (见:bbum blog

基本上,他们的方法是运行 Instruments allocate 工具,获取一个 heapshot,运行代码的迭代和另一个 heapshot,重复 3 或 4 次。这将指示在迭代期间已分配但未释放的内存。

在这种情况下,在下载之间进行一次快照(现在称为不同的名称)。

要弄清楚结果,请披露以查看各个分配。

如果您需要查看对象的保留、释放和自动释放发生的位置,请使用 Instruments:

在 Instruments 中运行,在 Allocations 中将“记录引用计数”设置为开启(您必须停止记录才能设置该选项)。让问题代码运行,停止记录,然后搜索感兴趣的对象。之后,您需要向下钻取,您将能够看到所有保留、释放和自动释放发生的位置。

【讨论】:

    【解决方案2】:

    首先,按照@Zaph 的建议查看堆镜头。值得您花时间查看正在分配和未发布的内容。

    我使用的另一种技术是使用仪器过滤选项来过滤我的应用程序中的类的显示。然后,我寻找具有异常数量的活动实例的类。例如,大多数视图控制器通常只有一个活动实例。如果还有更多,那么有些东西正在保留它们。块和通知侦听器通常是原因。

    在您的示例屏幕截图中,我注意到有两件事需要调查。

    首先,你有 365 个活的核心动画,占用了大约 30M。不知道为什么,但值得思考。

    其次,在底部附近,我注意到 166 个表格视图单元格滚动视图。听起来很多。我看不到你有多少活表视图控制器,但我想知道它们是否没有重新分配。过滤此列表将有助于确定未解除分配的内容。

    最后,泄漏对于发现问题很有用,但大多数情况下,我们认为的泄漏对于仪器来说看起来没问题。因此,查看内存和已分配实例的数量是一个更好的指南,可以更好地找到没有被释放的地方。

    【讨论】:

      【解决方案3】:

      没有任何代码很难说,但看起来你在某处有一个保留周期。

      尝试向视图控制器添加一个 dealloc 方法,并确保在视图控制器消失时输入它。

      您说您每 30 秒发出一个新请求。如果您使用带有视图控制器的计时器作为目标,则计时器对视图控制器具有强引用,反之亦然。当您的视图控制器消失时,您必须使计时器无效。

      【讨论】:

        猜你喜欢
        • 2017-09-17
        • 2013-10-08
        • 2011-06-14
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-10-27
        • 2017-04-02
        • 2018-05-01
        相关资源
        最近更新 更多