dispatch_async嵌套块
问题描述:
我正在使用dispatch_async方法在主队列中执行任务。但它造成保留周期:dispatch_async嵌套块
以下是代码片段:
self.test = ^{
dispatch_async(dispatch_get_main_queue(), ^{
NSLog(@"%@", self);
});
};
我不能得到妥善为什么它正在创建挡周期。由于我的控制器没有dispatch_async块的所有权。
答
尝试使用weakSelf
:
__weak typeof(self) weakSelf = self;
self.test = ^{
dispatch_async(dispatch_get_main_queue(), ^{
NSLog(@"%@", weakSelf);
});
};
+0
中,但是然后'self'可以在外块的运行之间解除分配和内部块的(异步)运行,这可能不是他想要的 – newacct
答
如果你不希望外部块保留self
,但希望内部块中能够保持self
活着一旦出动,也许是这样的:
typeof(self) __weak weakSelf = self;
self.test = ^{
typeof(self) strongSelf = weakSelf;
if (strongSelf) {
dispatch_async(dispatch_get_main_queue(), ^{
NSLog(@"%@", strongSelf);
});
}
};
属性'test'保留闭包并且闭包包含对'self'的引用无关紧要,那个引用本身在块 – Paulw11