gpt4 book ai didi

objective-c - NSThread 内存泄漏

转载 作者:行者123 更新时间:2023-12-03 17:55:07 25 4
gpt4 key购买 nike

我使用 NSThread 如下

NSThread * thread = [[NSThread alloc] initWithTarget:object selector:@selector(bg) object:nil];
[thread start];

稍后我想停止线程并释放对象,如下所示:

[thread cancel];
[object release];

这似乎工作正常。然而,当我查看泄漏工具时,我发现我的代码中没有出现一些神秘的泄漏(空的 NSArray)。当我查看 malloc 历史记录时,我发现 NSArray 正在“willChangeValueForKey”方法中分配,该方法最终从我的 [object dealloc] 调用。它恰好将委托(delegate)设置为零。该委托(delegate)正在被观察(因此 willChangeValueForKey?)。 [object dealloc] 从 [NSThread exit] 调用。

我的猜测是,这是因为 [线程取消] 不会立即停止线程(毕竟它位于不同的线程中)。然后我们在主线程上释放对象。这使其保留计数为 1。然后 NSThread 将在实际旋转时释放对象。看来这会导致泄漏。我尝试了这个快速改变来验证我的假设:

[thread cancel];

[NSThread sleepForTimeInterval:1];
// This makes it wait until the thread releases [object]

[object release];

问题:为什么让 NSThread 释放我的对象是不安全的?这是否与观察者代码在 dealloc 中不安全有关?

最佳答案

您的主线程应该能够立即[对象释放],您不必等到取消线程,甚至启动它。 initWithTarget: 隐式保留 objectcancel 隐式释放它。

您不必在主线程上保留对象,以便为了分离线程而使其保持事件状态。

关于objective-c - NSThread 内存泄漏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14886410/

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