【问题标题】:In IOS, ARC, although the reference Count drops to 0, the object still hadn't been freed在IOS,ARC中,虽然reference Count下降到0,但对象仍然没有被释放
【发布时间】:2014-09-22 00:12:44
【问题描述】:

我的代码如下,在 IOS7.1 的 ARC 下。

void function
{
  for (int i = 0; i < 100000; i++)
    {
        UIImage *buttonBar_test = [[UIImage alloc] init];
        //[buttonBar_test release];
    }

}

虽然 ref 计数下降到 0,但临时对象(buttonBar_test)仍然存在,在函数返回后未被系统释放。为什么?

![在仪器->分配中,启用“记录引用计数”][1]

![函数返回后,临时对象还活着,很奇怪?!][2]

![引用计数降至 0,但没有对对象调用“free”,因此对象仍然存在][3]

我创建了一个演示项目,这个问题不存在。但在我自己的项目中,它存在。不知道为什么,有没有和这个问题相关的配置?

(另外,我自己的项目链接了一些未启用 arc 的 3rd 方依赖项,但在我的全局链接器标志设置中,它包含:-fobjc-arc)

【问题讨论】:

    标签: ios objective-c automatic-ref-counting dealloc


    【解决方案1】:

    如果调用了dealloc,但支持对象的内存没有释放,有两种可能:

    1. 您没有在-dealloc 末尾调用[super dealloc](仅适用于非ARC 代码)
    2. 您启用了僵尸。这可以通过 Instruments 中的复选框(在 ObjectAlloc 工具的配置中)或通过 Scheme 编辑器中的 Diagnostics 选项卡来完成。

    你很可能有Zombies enabled,
    这是一个如何禁用它的小指南。

    1) 打开方案编辑器。

    2) 点击Run $&lt;Project name&gt;(标签1)
    3) 点击Diagnostics(标签2)
    4) 取消选中Enable Zombie Objects

    【讨论】:

    • 我是第一个在这个网站上自己提问的人。我能知道我该如何感谢你吗?是否有任何“关闭”按钮或任何声誉奖励按钮?
    • 我只需单击勾号使其变为绿色。抱歉,我的声望不够,无法投票。
    • @AlonzoChen 也谢谢你 :),我很高兴它有帮助。
    猜你喜欢
    • 2012-07-02
    • 1970-01-01
    • 1970-01-01
    • 2016-03-04
    • 2011-02-09
    • 1970-01-01
    • 2010-12-02
    • 2013-06-24
    • 1970-01-01
    相关资源
    最近更新 更多