在ARC应用程序上不会调用Dealloc

我有一个UIViewController被推入容器控制器,然后popup,并使用分配仪器,我可以看到视图控制器后被销毁。 但是,控制器的dealloc中的断点永远不会到达。 有谁知道为什么dealloc不被称为? ARC可以在不调用dealloc的情况下销毁对象?

另外,我禁用了NSZombies(有人说可能会导致dealloc不会触发)。

编辑:

Dealloc并没有太多的function,只是打印到控制台上,并且永远不会被调用:

- (void)dealloc { NSLog(@"Deallocating..."); }

我不能发布容器控制器 – 它是专有的,太复杂了。 Dealloc在一些控制器上被一致地调用,而不是其他的。 如果我能find时间,我会尝试发布一个简化版本来重现问题。

有什么办法来validationNSZombies被禁用?

EDIT2

我正在张贴从仪器的截图; 它看起来像它正确地释放。

在这里输入图像说明

我刚刚遇到类似的问题。 你指的是“自我”吗? 我在init里面有一些通知观察的地方,我指的是“自我”。 在ARC下,自我保留在块中。 我的dealloc没有被调用,那是我去除观察的地方。

诀窍是创build一个__weak(iOS 5+)或__unsafe_unretained(iOS 4.x)引用你的“自我”,并使用它来访问自我或任何_iVars(这将导致“自我”保留以及)在块。 这是一个例子。

 __unsafe_unretained TableViewController *weakSelf = self; [[NSNotificationCenter defaultCenter] addObserverForName:NSManagedObjectContextObjectsDidChangeNotification object:nil queue:nil usingBlock:^(NSNotification *note) { if (weakSelf.tableView) { [weakSelf.tableView reloadData]; } }]; 

在我的情况下,这是NSTimer 。 它保留了它的目标,所以当你完成视图控制器的时候,你需要使计时器无效。

如果VC没有调用dealloc,那么我敢打赌在你的代码中有一个循环引用,这就阻止了ARC调用dealloc。

有些事情要检查:

  1. 你有一个实例化的对象引用回VC吗?
  2. 如果您需要引用VC,请确保您已使用“__unsafe_unretained”属性或“弱”(iOS5 +),以便不发生保留周期。

当我的代表声明没有使用__unsafe_unretained时,我被咬了一会儿。

即使使用ARC,您也可以手动检查参考计数:

 CFIndex rc = CFGetRetainCount((__bridge CFTypeRef)myObj); 

你可以肯定地知道你的代码是否被挂在一个内存周期中。

我的问题是代表。

检查你的代表! 代表财产应该有weak指定:

@property (weak, nonatomic) id<SomeProtocol> delegate;

这是另一个小费(发生在我身上):

tl; dr:看看你的类实例variables,而不仅仅是类属性。 你是否在代码中分配任何实例variables,而不是以后设置nil

我有一个类的一堆属性( @property (nonatomic, strong)@property (nonatomic, weak) )在其头文件。 我一个一个地评论这些属性,看看这是否会改变任何事情。 它没。 主要class级还没有被释放。 所以问题不在于属性。

之后我做的是看实例variables。 我有一个实例variables(这是一个UIViewController ),我在viewDidLoad创build。 这个从来没有得到释放!

当我删除这个variables,果然,我的主类叫dealloc。

所以,因为这个还没有解除分配,所以我的主类也没有被解除分配。 将该实例variables作为属性移动解决了我的问题。

问题:我不知道为什么会发生这种情况。 操作系统是否可以更好地控制类的属性,而不是实例variables? 看起来有点奇怪,包含实例variables的父类因为它的实例variables而没有被释放。

你有NSZombieEnabled? 看到这个问题:

为什么在使用ARC + NSZombieEnabled时不会释放对象

我被这个难住了一阵子自己…