【发布时间】:2014-08-20 15:06:19
【问题描述】:
在我的应用程序的某个时刻,我从其父视图控制器(我们称其为 B)中删除了一个视图控制器(我们称其为 A)。而且即使 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] 替换对此类方法的调用时,一切都按预期工作。我不知道发生了什么。有什么想法吗?
【问题讨论】:
-
这里没有足够的信息,您将类称为“A”和“B”,但哪个是 MyViewController?堆栈跟踪不完整(从 1 跳到 10) - 您需要缩放窗口以打开所有条目。对于最初的问题 - A 是如何分配和使用的?显示更多代码。
-
您是否有一些想要在 dealloc 中发生的逻辑,或者您对垃圾回收的工作原理感到好奇?
-
@BrianWalker :这是我在 Xcode 中的完整堆栈跟踪,1 到 10 之间没有任何内容。或者我不知道如何找到它。我会尝试添加更多代码
-
@brodney :ARC 不是垃圾收集器。是的,我需要在 dealloc 中执行一些重要操作
-
我的意思是问你是否依赖它们在某个时间发生。您可以在堆栈跟踪面板底部看到 1-10 之间的滑块。
标签: ios objective-c automatic-ref-counting