gpt4 book ai didi

objective-c - 我可以在 -dealloc 中调用 [self retain] 吗?或者,如何确保 dealloc 发生在主线程上?

转载 作者:可可西里 更新时间:2023-11-01 05:16:23 27 4
gpt4 key购买 nike

这是我的情况。这很复杂,所以请耐心等待。

我有一个 View 类,我们称它为 MyView。它创建一个加载指示器 subview ,然后启动将加载数据的后台操作。它还创建了一个 block ,后台队列操作完成后将在主队列中排队。该 block 通过添加另一个 subview (UITextView)和已加载的数据来准备 View 。当然,要做到这一点, block 必须具有对 View 的引用。

所以后台操作保留了block,block保留了view。到目前为止和我在一起吗?

有时 MyView 的实例会在后台队列操作完成之前从其 super View 中删除。有时调用 block 的主队列操作在后台队列操作被完全清理之前被完全清理。在这种情况下,MyView 的实例可以在后台线程上获得其 -dealloc 调用,因为对 View 的最后一次引用属于 block ,而最后一次引用该 block 属于后台操​​作。

UIKit 不喜欢从除主线程之外的任何线程调用。在 UITextView 的情况下,显然它甚至包括 -dealloc 调用。在 TextView 的 -dealloc 期间,我从称为“网络线程锁”的东西中获取了 EXC_BAD_ACCESS

我认为后台线程有时拥有最后一个引用是合理的,我想在我的 -dealloc 实现中处理这个问题,如下所示:

- (void)dealloc {
if ([NSOperationQueue currentQueue] == [NSOperationQueue mainQueue]) {
// The usual -- dealloc subviews safely on the main thread
self.myIvar = nil;
[super dealloc];
}
else {
// Not on the main thread, so keep the object alive
// in spite of the dealloc call.
[self retain]; // explicit retain
[[NSOperationQueue mainQueue]
addOperationWithBlock:^{ // implicit retain at block creation
[self release]; // explicit release
}]; // implicit release, dealloc called again, but on the main thread
}
}

因此,当您在对象上调用 -release 时,如果保留计数达到零,则 NSObject 中的实现会调用 -dealloc。这就是发生的一切吗?换句话说,可以调用 -dealloc调用 super 吗?我是在制作某种可恶的僵尸对象还是这样好?

如果这不行,确保在主线程上调用 -dealloc 的好方法是什么?

最佳答案

为什么不直接覆盖发布?

- (void)release
{
if (![NSThread isMainThread]) {
[self performSelectorOnMainThread:@selector(release) withObject:nil waitUntilDone:NO];
} else {
[super release];
}
}

编辑:这是 ARC 之前的版本。不要用 ARC 来做。

关于objective-c - 我可以在 -dealloc 中调用 [self retain] 吗?或者,如何确保 dealloc 发生在主线程上?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5769346/

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