强烈引用块内部弱引用

为什么有必要强调一个块内的弱引用?

我明白,在块内有一个弱引用将避免保留周期。 但是,为什么还要再强烈地提到弱者呢?

背景:
正如梅森所描述的,这是最好的做法。

我知道在块内引用自我的正确方法是在块外创build一个弱引用,然后在块内引用弱引用[…]

例:

__weak typeof(self) weakSelf = self; void (^someBlock)(id) = ^(id data){ typeof(self) strongSelf = weakSelf; // code using strongSelf }); 

想象一下,最后一个对自己的强烈的引用被保存在一个不同的线程上,与你的块运行的线程不同。

现在这发生了:

 __weak typeof(self) weakSelf = self; void (^someBlock)(id) = ^(id data){ if (weakSelf != nil) { // last remaining strong reference released by another thread. // weakSelf is now set to nil. [myArray addObject:weakSelf]; } }); 

这将会导致一个NSInvalidArgumentexception,将nil添加到数组中。

在使用之前使引用强壮可以消除潜在的竞争条件,并确保指针始终指向同一个对象。

如果你100%确定一个对象只能被一个线程引用,那么这样做不是必须的。 但做这个假设是不好的做法。

这不是固有的必要,但总体思路是确保weakSelf所指向的对象在块执行时不会被释放。 创build强引用具有保留对象的副作用。 当强大的参考超出范围时,保留将由ARC发布。 这在很大程度上是防守的。 一般而言,您应该致力于提供其他(更好的)保证,以确保您的系统在块执行期间保持稳定。