我们是否需要在Objective-C中使用弱自我?

时间:2016-04-13 18:28:57

标签: objective-c objective-c-blocks weak-references retain-cycle

我注意到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

1 个答案:

答案 0 :(得分:6)

在给出的示例中,使用dispatch_async,将没有保留周期,因此在此强烈捕获self是安全的。唯一的区别是,如果self在调用此dispatch_async和块实际运行之间的所有其他内容时释放,则会稍微延迟self的实际重新分配时间,并且可能会影响释放实际发生在哪个线程上。但总的来说,使用dispatch_async时无论如何都不会造成伤害。

您可能希望按照上面的示例的方式进行操作的一种情况是,如果在块中运行的代码有些昂贵并且只想在绝对必要时执行,并且如果它是不必要的话其他一切已经释放self

另一种情况可能是self使用大量内存并在其他东西开始消耗大量内存之前正常解除分配。在这种情况下,您可能不希望同时分配这两个实例。