我注意到Apple's documentation说我们在捕捉自我时需要避免强烈的参考周期。
示例中的块是self的属性。
但是如果我在dispatch_async语句中将块作为局部变量放置怎么办?
在这种情况下,即使我直接调用self方法,它也不会创建保留周期,对吗?
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
答案 0 :(得分:6)
在给出的示例中,使用dispatch_async
,将没有保留周期,因此在此强烈捕获self
是安全的。唯一的区别是,如果self
在调用此dispatch_async
和块实际运行之间的所有其他内容时释放,则会稍微延迟self
的实际重新分配时间,并且可能会影响释放实际发生在哪个线程上。但总的来说,使用dispatch_async
时无论如何都不会造成伤害。
您可能希望按照上面的示例的方式进行操作的一种情况是,如果在块中运行的代码有些昂贵并且只想在绝对必要时执行,并且如果它是不必要的话其他一切已经释放self
。
另一种情况可能是self
使用大量内存并在其他东西开始消耗大量内存之前正常解除分配。在这种情况下,您可能不希望同时分配这两个实例。