ios - 对 block 内弱引用的强引用

标签 ios objective-c objective-c-blocks

为什么必须在 block 内对弱引用进行强引用?

我知道在 block 中使用弱引用可以避免循环引用。但是为什么又要有强引用弱引用呢?

背景:
正如 Mason 所述,这是最佳实践。

I know the proper way to refer to self inside a block is to create a weak reference outside the block, and then a strong reference to that weak reference inside the block[...]

示例:

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

最佳答案

想象一下,最后剩下的对 self 的强引用保存在与您的 block 运行所在的线程不同的线程上。

现在发生这种情况:

__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];
    }
});

这将因向数组添加 nil 时出现 NSInvalidArgument 异常而崩溃。

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

如果您 100% 确定一个对象只会被一个线程引用,那么就没有必要这样做。但做出这种假设是不好的做法。

关于ios - 对 block 内弱引用的强引用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23806751/

相关文章:

ios - RestKit 核心数据映射一对多

ios - 有效的 iOS 分发证书 - 开发者名称更改

ios - 如何从模态视图 Controller 调用呈现 View Controller 的方法

objective-c - iOS中使用 block 对象的动画 block ?

ios - PDFKit 高亮注释 : quadrilateralPoints

ios - 内容插图不工作 Storyboard Xcode8

iphone - UIView 不透明属性

iphone - 切换到 iOS 5 后无法播放系统声音

ios - NSSet 看起来像一个协议(protocol) (NSSet<NSObject *> *name)

ios - Objective-C语法问题