仪器内存泄漏与ARC混淆

时间:2013-01-02 14:17:45

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

早上好,

我正在对我一直在研究的这个应用程序做一些微调,只是为了确保一切运行顺畅,没有发生内存泄漏。所以我使用Instruments运行我的应用程序,然后选择了分配和泄漏工具。

我的应用程序运行得非常好,直到Insturments检测到泄漏的对象恰好是UIImage。令我感到困惑的是我使用ARC,所以我的理解是所有保留/释放/自动释放呼叫都正在为我照顾。

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

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

Instruments screenshot

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

谢谢,

编辑:这是我泄漏的最新快照 This is the latest snapshot that I have for the leak

3 个答案:

答案 0 :(得分:3)

那么,泄漏可能源于框架内部(UIKit或更深层)。如果是这样,那么你就无能为力了。要么它是你的应用程序内部的某种“副作用”,它会在UIKit后面显示出来([UIImage imageWithCGImage:scale:orientation]),或者是UIKit本身的一些问题。但最终很难说清楚!

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

答案 1 :(得分:1)

更新

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

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

答案 2 :(得分:0)

我有同样的问题然后我改变代码使用外观选择器,如下面然后问题

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