菜鸟教程小白 发表于 2022-12-13 00:55:13

ios - 对象被释放但没有调用 dealloc


                                            <p><p>在我的应用程序的某个时刻,我从其父 ViewController (我们称其为 <strong>B</strong>)中删除了一个 ViewController (我们称其为 <strong>A</strong>)。而且即使 A 不再被引用,它的 dealloc 方法也不会被调用。</p>

<p>我用仪器查了一下,A真的被释放了。活体(A类)数量为0。</p>

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

<p>dealloc 方法被调用的唯一时刻是 ViewControllerB 被释放的时候。那一刻,堆栈跟踪是这样的:</p>

<pre><code>#00x0001ac78 in - &lt;-- This is A
#10x021061bf in _objc_deallocOnMainThreadHelper ()
#20x029f34d0 in _dispatch_client_callout ()
#30x029e1726 in _dispatch_main_queue_callback_4CF ()
#40x0274443e in __CFRUNLOOP_IS_SERVICING_THE_MAIN_DISPATCH_QUEUE__ ()
#50x026855cb in __CFRunLoopRun ()
#60x026849d3 in CFRunLoopRunSpecific ()
#70x026847eb in CFRunLoopRunInMode ()
#80x046095ee in GSEventRunModal ()
#90x0460942b in GSEventRun ()
#10 0x00db4f9b in UIApplicationMain ()
#11 0x00028ea2 in main at /../main.m:17
</code></pre>

<p>我不确定dealloc是如何触发的</p>

<p>知道这里会发生什么吗? </p>

<p>-- 编辑</p>

<p>我使用类方法创建 ViewControllerA:</p>

<pre><code>+ (instancetype)viewController
{
    return [ init];
}
</code></pre>

<p>奇怪的是,当我用 [ init] 替换对此类方法的调用时,一切都按预期工作。我不知道发生了什么。有什么想法吗?</p></p>
                                    <br><hr><h1><strong>Best Answer-推荐答案</ strong></h1><br>
                                            <p><p>我终于找到了发生的事情。 </p>

<p>未被dealloc的 ViewController 是通过类方法创建的,例如:<br/>
<code>+ (instancetype) createMyViewController</code>。 </p>

<p>这种方法返回自动释放对象。</p>

<p>我唯一的猜测是,在我的情况下,自动释放池已经耗尽得太晚了。在适当的代码周围添加 <code>@autoreleasepool {}</code>block 可以解决所有问题。</p></p>
                                   
                                                <p style="font-size: 20px;">关于ios - 对象被释放但没有调用 dealloc,我们在Stack Overflow上找到一个类似的问题:
                                                        <a href="https://stackoverflow.com/questions/25408225/" rel="noreferrer noopener nofollow" style="color: red;">
                                                                https://stackoverflow.com/questions/25408225/
                                                        </a>
                                                </p>
                                       
页: [1]
查看完整版本: ios - 对象被释放但没有调用 dealloc