在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;
}];
上面的代码段是正确的吗?请确认。
答案 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
。如果你告诉我们你要用这个代码做什么,我们可以无疑向您展示了实现它的更好方法。)