__weak + __block可以将两者用于变量

时间:2015-09-24 13:50:11

标签: ios automatic-ref-counting objective-c-blocks weak-references

在ARC中,以下代码行是否有意义?请确认。

__block __weak MyViewController_iPad *blockSelf = self;

这不会引发任何错误。不知道为什么。

请考虑以下示例。

NSArray* keyWords = someArray;

[keyWords enumerateObjectsUsingBlock:^(id  _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) {
                keyWords = nil;
            }];

在这种情况下,我们是否需要在ARC下指定两个属性。这是不寻常的,这就是我怀疑的原因。

__weak __block NSArray* keyWords = someArray;

[keyWords enumerateObjectsUsingBlock:^(id  _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) {
                    keyWords = nil;
                }];

上面的代码段是正确的吗?请确认。

2 个答案:

答案 0 :(得分:3)

如果要在块中更改变量值,则应使用__block。

e.g:

__block BOOL result = NO;
dispatch_sync(dispatch_get_main_queue(), ^{
  ...
  result = YES;
  ...
});

如果你想避免保留周期,你应该使用__weak。

e.g。

__weak typeof(self) wself = self;
self.foobarCompletion = ^{
  ...
  wself.foo = YES;
  ...
};

如果有需要,您可以将它们合并。

答案 1 :(得分:2)

在您的编辑中,您提供了一些示例代码:

__weak __block NSArray* keyWords = someArray;

[keyWords enumerateObjectsUsingBlock:^(id  _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) {
    keyWords = nil;
}];

在这种情况下__weak既不需要也不合适。通常,您将__weak与块结合使用以避免强引用周期。但是这里没有这样的循环,因此不需要__weak

只需使用__block,删除__weak即可。

(尽管如此,这个例子代表了其他问题,即在枚举数组时你真的不应该改变keyWords。如果你告诉我们你要用这个代码做什么,我们可以无疑向您展示了实现它的更好方法。)