【问题标题】:Instruments Memory Leak With ARC ConfusionInstruments 内存泄漏与 ARC 混淆
【发布时间】:2012-12-16 21:57:18
【问题描述】:

早上好,

我正在对我一直在开发的这个应用程序进行一些微调,只是为了确保一切运行顺利并且没有发生内存泄漏。因此,我使用 Instruments 运行我的应用程序,并选择了分配和泄漏工具。

在 Insturments 检测到恰好是 UIImage 的泄漏对象之前,我的应用程序运行良好。让我感到困惑的是我使用的是 ARC,所以我的理解是所有的保留/释放/自动释放调用都在为我处理。

让我感到困惑的另一件事是,当我看到泄漏的扩展详细信息时,它显示责任框架是 [UIImage imageWithCGImage:scale:orientation] 并且我从未在我的整个应用程序中调用过该方法,我什至做到了在我的工作区中搜索它并没有得到任何结果。

当我双击泄漏的对象以在 Xcode 中为我打开它时,它只是打开了一个框架并显示“不可用”。截图如下:

点击右边的 Xcode 标志也没有任何帮助。我一直在尝试调试这可能是什么,这让我很难过。我确保 NSZombieEnabled 设置为 YES 以防万一我尝试使用已释放的对象,但我无法找到解决方案。为什么会发生这种情况(在 ARC 下),我该如何解决?

谢谢,

编辑:这是我对泄漏的最新快照

【问题讨论】:

    标签: iphone objective-c memory-leaks automatic-ref-counting instruments


    【解决方案1】:

    那么,泄漏可能源自框架内部的某个地方(UIKit 或更深)。如果是这样,那么您无能为力。要么是应用程序内部的某种“副作用”,后来在 UIKit 内部深处出现([UIImage imageWithCGImage:scale:orientation]),要么是 UIKit 本身的问题。但最终很难确定!

    使用 ARC 仍然不能保证 100% 无内存泄漏的代码! ;)

    【讨论】:

    • 那么如果是UIKit的问题,那我的app在发货的时候会漏吗?我对此无能为力吗?
    • 现在内存已经扩展为更复杂的东西,我又拍了一张快照
    • 不幸的是,可以这么说!您/我们可以希望 Apple 在下一个 iOS 版本中修复它,或者您可以尝试找到一种解决方法,以便您的代码不会执行有缺陷的框架代码。您的应用现在实际泄漏了多少内存?
    • 它开始时只有 44 个字节,但在我拍摄的最新快照中,它变得有点复杂(我什至还没有在这个应用程序中编写过泄漏代码),现在它泄漏了大约 380 个字节-400 字节,我想这并不多,但它仍然在泄漏
    【解决方案2】:

    更新

    在花了我一天的时间调试代码并希望尽管应用程序只泄漏大约 400 字节的情况下不泄漏它,但我让它无泄漏。非常感谢@Nenad M 的帮助。事实证明,我的泄漏的一个非常奇怪的来源是将我的 UITabBar 的 selectedImageTintColor 设置为 [UIColor blueColor]。这一定是导致 CoreGraphics 和/或 UIKit 内部的某些东西在某处触发 [UIImage imageWithCGImage:scale:orientation] 调用,而不是被 ARC 释放,就像你说的那样。

    虽然这是一个非常小的泄漏,但我鼓励所有人发布您的应用程序无泄漏!

    【讨论】:

    • 我能问一下您是如何将其追溯到如此晦涩的事情的吗?只是一个总体的攻击计划会有所帮助。
    【解决方案3】:

    我遇到了同样的问题,然后我将代码更改为使用如下外观选择器,然后问题就消失了

        [[UITabBar appearance] setTintColor:[UIColor redColor]];
        [[UITabBar appearance] setSelectedImageTintColor:[UIColor brownColor]];
    

    【讨论】:

      猜你喜欢
      • 2017-05-26
      • 2014-04-03
      • 2012-04-03
      • 2011-06-28
      • 2011-06-07
      • 2012-09-14
      • 2012-10-05
      • 1970-01-01
      相关资源
      最近更新 更多