在IOS,ARC中,虽然引用计数降为0,但对象仍然没有被释放

时间:2014-07-30 11:13:23

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

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

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

}

虽然引用计数降为0,但临时对象(buttonBar_test)仍然存活,在函数返回后系统不会释放它们。为什么呢?

![在仪器 - &gt;分配中,启用&#34;记录参考计数&#34;] [1]

![函数返回后,临时对象仍然活着,非常奇怪?!] [2]

![引用计数降至0,但没有&#34; free&#34;在对象上被调用,所以对象仍然存在] [3]

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

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

1 个答案:

答案 0 :(得分:1)

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

  1. 您未在[super dealloc]结束时致电-dealloc(仅适用于非ARC代码)
  2. 您启用了Zombies。这可以通过Instruments中的复选框(在ObjectAlloc仪器的配置中)或通过Scheme编辑器中的Diagnostics选项卡完成。
  3. 您最有可能Zombies enabled
    这是一个如何禁用它的小指南。

    1)打开方案编辑器。

    enter image description here

    2)点击Run $<Project name>(标签1)
    3)点击Diagnostics(标签2)
    4)取消选中Enable Zombie Objects

    enter image description here