gpt4 book ai didi

ios - 对象被释放但未调用 dealloc

转载 作者:塔克拉玛干 更新时间:2023-11-02 21:21:23 28 4
gpt4 key购买 nike

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

我用仪器检查过,A真的被释放了。 (A类)活体数量为0。

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

调用 dealloc 方法的唯一时刻是 View Controller 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 是如何触发的

知道这里会发生什么吗?

-- 编辑

我使用类方法创建 View Controller A :

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

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

最佳答案

我终于知道是怎么回事了。

未被 dealloc 的 View Controller 是通过类方法创建的,例如:
+(实例类型)createMyViewController

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

我唯一的猜测是,在我的情况下,自动释放池耗尽的时间太晚了。在适当的代码周围添加一个 @autoreleasepool {} block 可以修复所有问题。

关于ios - 对象被释放但未调用 dealloc,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25408225/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com