强烈引用块内部弱引用
为什么有必要强调一个块内的弱引用?
我明白,在块内有一个弱引用将避免保留周期。 但是,为什么还要再强烈地提到弱者呢?
背景:
正如梅森所描述的,这是最好的做法。
我知道在块内引用自我的正确方法是在块外创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发布。 这在很大程度上是防守的。 一般而言,您应该致力于提供其他(更好的)保证,以确保您的系统在块执行期间保持稳定。
- 如何正确使用“openParentApplication”和“handleWatchKitExtensionRequest”以便“reply()”被调用?
- 使用UIImage imageWithData时,图像不显示:NSData dataWithContentsOfFile
- Objective-C / iOS:获取某一周的特定date(星期日)
- 一个iOS应用程序可以使用多less内存?
- UIDocumentInteractionController停止工作iOS 8
- 在UISlider中增加拇指“点击区域”
- Swift:将video从NSURL保存到用户相机胶卷
- Appium 仪器在启动时崩溃
- iPhone应用崩溃在