对象被释放但dealloc未被调用

时间:2014-08-20 15:06:19

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

在我的应用中的某个时刻,我从其父视图控制器中删除了一个视图控制器(让我们称之为 A )(让我们称之为 B )。即使A不再被引用,也不会调用它的dealloc方法。

我用乐器检查过,A真的被释放了。生命对象(A类)的数量为0。

NSZombie未启用,我看到它可能会干扰dealloc调用。

调用dealloc方法的唯一时刻是取消分配视图控制器B.那时,堆栈跟踪就是这样:

#0  0x0001ac78 in -[MyViewController dealloc] <-- This is A
#1  0x021061bf in _objc_deallocOnMainThreadHelper ()
#2  0x029f34d0 in _dispatch_client_callout ()
#3  0x029e1726 in _dispatch_main_queue_callback_4CF ()
#4  0x0274443e in __CFRUNLOOP_IS_SERVICING_THE_MAIN_DISPATCH_QUEUE__ ()
#5  0x026855cb in __CFRunLoopRun ()
#6  0x026849d3 in CFRunLoopRunSpecific ()
#7  0x026847eb in CFRunLoopRunInMode ()
#8  0x046095ee in GSEventRunModal ()
#9  0x0460942b in GSEventRun ()
#10 0x00db4f9b in UIApplicationMain ()
#11 0x00028ea2 in main at /../main.m:17

我不确定如何触发dealloc

知道这里会发生什么吗?

- 编辑

我使用类方法创建视图控制器A:

+ (instancetype)viewController
{
    return [[MyViewController alloc] init];
}

奇怪的是,当我用[[MyViewController alloc] init]替换对这个类方法的调用时,一切都按预期工作。我不知道发生了什么。有什么想法吗?

2 个答案:

答案 0 :(得分:1)

我终于找到了发生的事情。

未被dealloc的视图控制器是通过类方法创建的,例如:
+ (instancetype) createMyViewController

这种方法返回自动释放对象。

我唯一的猜测是,自动释放池在我的情况下耗尽太晚了。在适当的代码周围添加@autoreleasepool {}块修复了所有内容。

答案 1 :(得分:0)

查看这些视图控制器生命周期方法。其中一个可能是你在dealloc中拥有的代码的正确位置,你可以指望它们在所述的时间被调用。 Dealloc只应用于内存清理,例如免费。

- (void)viewWillDisappear:(BOOL)animated

- (void)viewDidDisappear:(BOOL)animated