【问题标题】:__weak + __block is it Ok to use both for a variable__weak + __block 可以同时用于变量吗
【发布时间】:2015-09-24 13:50:10
【问题描述】:

在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;
                }];

上面的代码sn -p 对吗?请确认。

【问题讨论】:

  • 您期待什么错误?你认为这意味着/会做什么?你想用它做什么?
  • 嗨 Wain,我添加了示例。

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


【解决方案1】:

如果你想改变块中的变量值,你应该使用__block。

例如:

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

如果你想避免保留循环,你应该使用 __weak。

例如

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

如果需要,您可以将它们组合起来。

【讨论】:

    【解决方案2】:

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

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

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

    只需使用__block,删除__weak,就完成了。

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

    【讨论】:

    • 谢谢@Rob。是的,我们不应该在编辑时修改“关键字”。对不起,我举了一个原始的例子。但根据 Apple 文档“[obj doSomething: ^{ [obj something]; } ];”如果关键字是 if "self" 的全局范围,则是类型保留循环的示例。我对吗 ?如果我错了,请纠正我。
    • @arango_86 - 如果doSomething 使用该块然后释放它(即,让它超出范围),那么在该点之外没有强引用循环。但如果doSomething 采用该闭包并将其保存为obj 的属性,则可能会导致强引用循环。这仅取决于doSomething 在做什么。但是,声明一个同样是__weak__block 变量是非常不寻常的。我很难想出我什至会考虑这样做的现实场景。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-07-31
    • 1970-01-01
    • 1970-01-01
    • 2012-02-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多