dispatch_async嵌套块

时间:2017-05-16 12:24:05

标签: ios objective-c xcode grand-central-dispatch objective-c-blocks

我使用dispatch_async方法在主队列中执行任务。但它导致保留周期:

以下是代码段:

self.test = ^{
        dispatch_async(dispatch_get_main_queue(), ^{
            NSLog(@"%@", self);
        });
   };

我无法正确创建保留周期的原因。由于我的控制器没有dispatch_async块的所有权。

2 个答案:

答案 0 :(得分:1)

尝试使用weakSelf

__weak typeof(self) weakSelf = self;

self.test = ^{
    dispatch_async(dispatch_get_main_queue(), ^{
        NSLog(@"%@", weakSelf);
    });
};

答案 1 :(得分:0)

如果您不希望外部块保留self,但希望内部块能够在调度后保持self活着,可能是这样的:

typeof(self) __weak weakSelf = self;
self.test = ^{
    typeof(self) strongSelf = weakSelf;
    if (strongSelf) {
        dispatch_async(dispatch_get_main_queue(), ^{
            NSLog(@"%@", strongSelf);
        });
    }
};