dealloc中的dispatch_async。如何使用它?

时间:2015-05-26 09:15:02

标签: ios objective-c

我有几个控制器应该在销毁后发送一些回调。
我用它来帮助它

+ (void) runInMain:(void (^)(void))block
{
    if ([NSThread isMainThread]) {
        block();
    }
    else {
        dispatch_async(dispatch_get_main_queue(), block);
    }
}

并在-dealloc中运行

- (void) dealloc
{
    if (self.hasChanges) {
        [CommonSystem runInMain:^{
            [self.updTarget performSelector:self.updAction withObject:nil];
        }];
    }
}

自我被保留在这个区块中?他的成员呢? 这段代码会导致崩溃吗? 如何解决这个问题的最佳方法是什么?

更新
Apple post关于"解除分配问题"有一些文字:

  

当您启动辅助线程时,该线程的共同点是   保留目标对象。这在许多情况下发生,   包括:
... 当你异步运行一个块和块时   引用self或实例变量

这是否意味着调用dispatch_async会在-dealloc中保留self,或者它为时已晚?

解决方案
在析构函数中等待完成父处理程序 1)

[self.updTarget performSelectorOnMainThread:self.updAction withObject:nil waitUntilDone:YES];

2)

dispatch_sync(dispatch_get_main_queue(), ^{
    [self.updTarget performSelector:self.updAction withObject:nil];
});

1 个答案:

答案 0 :(得分:1)

在销毁之后没有任何对象可以发送回调,有一些方法,如委托,可以从dealloc调用任何类型的回调数据,你可以定义和使用到你的控制器,如果你不这样做通知是最好的。我希望代表团能够实施。如果您正在调用任何父控制器方法并且您真正知道如何处理它但强烈避免使用dealloc方法定制,则可以使用高级选项方法sizzling。