我注意到了 Apple's documentation说我们在捕获 self 时需要避免强引用循环。
示例中的 block 是 self 的属性。
但是如果我将一个 block 作为局部变量放在 dispatch_async 语句中呢?
在这种情况下,即使我直接调用self的方法也不会产生retain cycle吧?
this article 是否需要以下代码生成 weakSelf? ?
// your code
__weak typeof(self) weakSelf = self;
dispatch_async(dispatch_get_main_queue(), ^{
__strong typeof(weakSelf) strongSelf = weakSelf;
if (strongSelf) {
[strongSelf doThis];
[strongSelf doThat];
[Manager.sharedInstance updateSuccessCount];
}
});
// more code
最佳答案
在给出的示例中,使用 dispatch_async
,不会有保留周期,所以捕获 self
是安全的强烈在这里。唯一的区别是如果self
在这dispatch_async
之间被其他一切释放被调用,当 block 实际运行时,它会稍微延迟 self
的实际释放。在那短暂的时间内,并且还可能影响释放实际发生在哪个线程上。但总的来说,使用 dispatch_async
时无论哪种方式都没有坏处。 .
您可能希望按照上面编写的示例的方式执行此操作的一种情况是,如果 block 中运行的代码有些昂贵并且只希望在绝对必要时执行,并且如果 self
则没有必要。已经被其他一切释放了。
另一种情况可能是 if self
使用大量内存并在其他东西开始消耗大量内存之前正常释放。在那种情况下,您可能不希望同时分配这两个实例。
关于objective-c - 我们需要在 Objective-C 的 block 中使用 weak self 吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36606655/