【问题标题】:Ambiguities in using Instruments for iOS Development使用 Instruments 进行 iOS 开发的歧义
【发布时间】:2012-01-11 12:37:50
【问题描述】:

我正在使用 Instruments 分析应用程序。分析是使用分配工具以两种方式完成的:

  1. 通过在运行应用程序进行分析时直接选择分配
  2. 通过在运行应用程序进行分析时选择泄漏。

在这两种情况下,我都启用了分配工具进行测试。但令人惊讶的是,在这些情况下,我有两种不同的分配输出。

他们应该表现不同吗?或者这是 Instruments 的问题。

我使用 Leaks Tool 分析的时间:

在分配图中: 1. 我在图中得到很多峰值,实时字节和总字节是相同的。 2. 使用 1 分钟后,我得到了黑旗(我认为它是关于内存警告的警报)。然后在出现一组标志后,我的应用程序崩溃了。 (有时会发生这种情况,即使直接在设备中运行应用程序也是如此)

我使用分配工具分析的时间:

在分配图中: 1. 我没有像上述情况那样经常出现峰值。实时字节总是比总字节少。 2.我用了20多分钟,一直没有黑旗。

我了解到的一个事实是,当实时字节数和总字节数相等时,可以启用 NSZombieEnabled。

你们有没有遇到过这个问题。

更新 1:

我在第一个案例中遇到了另一个问题。每当我在短时间内进行分析(与第二种情况下的分析相比)时,该应用程序都会收到很多黑旗并且我的应用程序崩溃了。 (由于内存警告)

当我尝试逐步使用类似的应用程序时,我的应用程序没有崩溃并且没有任何标志。

为什么会出现这种差异?

【问题讨论】:

    标签: ios memory instruments


    【解决方案1】:

    根据分配的实例化方式,有不同的选项。通过单击“分配”图块中的“i”符号来检查选项。

    是的,我也觉得这很烦人。

    【讨论】:

    • 哪一个才是正确的?他们每个人在哪些方面不同?
    【解决方案2】:

    在第一种情况下,您只跟踪实时分配,因为“泄漏”模板以这种方式配置分配工具。在第二个中,您正在跟踪实时分配和解除分配。 (正如 CocoaFu 所说)。

    两者都很有用,但原因略有不同。

    仅跟踪实时分配(通常与堆分析结合使用)是分析应用程序中永久堆增长的好方法。一旦你知道什么是永远存在的,你就可以找出原因,看看是否有办法优化它。

    跟踪所有分配,无论是活动的还是死的,是跟踪分配带宽的一种非常有效的方法。您可以按总字节数排序并从最大的 # 开始。查看所有分配点(单击所选行类别中标签旁边的小箭头),查看所有分配的来源。

    例如,您的图表显示在该时间段内有 1.27MB 的 14 字节分配(9218 次分配)。所有这些都是 free()d [good!],但这仍然代表着要分配、填充数据(大概)和释放每一个的工作。这可能是个问题,也可能不是。

    (为了正确看待这一点,我使用这种技术来优化应用程序。通过仅仅专注于减少瞬态 - 短期 - 分配的数量,我能够使应用程序的主要算法速度提高 5 倍,并且减少 85% 的内存使用。原来应用程序复制字符串很多很多次。)


    不确定您的应用为何如您所描述的那样崩溃。由于它是内存警告,因此您应该查看最常分配的内容。

    请记住,如果您启用了僵尸检测,则会占用大量额外内存。

    【讨论】:

    • bbum:谢谢。我已经更新了这个问题。你能澄清我的疑问吗?
    猜你喜欢
    • 2015-01-08
    • 2011-10-13
    • 2015-07-06
    • 1970-01-01
    • 1970-01-01
    • 2011-08-03
    • 1970-01-01
    • 1970-01-01
    • 2012-06-17
    相关资源
    最近更新 更多