在我的应用中的某个时刻,我从其父视图控制器中删除了一个视图控制器(让我们称之为 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]替换对这个类方法的调用时,一切都按预期工作。我不知道发生了什么。有什么想法吗?
答案 0 :(得分:1)
我终于找到了发生的事情。
未被dealloc的视图控制器是通过类方法创建的,例如:
+ (instancetype) createMyViewController
。
这种方法返回自动释放对象。
我唯一的猜测是,自动释放池在我的情况下耗尽太晚了。在适当的代码周围添加@autoreleasepool {}
块修复了所有内容。
答案 1 :(得分:0)
查看这些视图控制器生命周期方法。其中一个可能是你在dealloc中拥有的代码的正确位置,你可以指望它们在所述的时间被调用。 Dealloc只应用于内存清理,例如免费。