在dispatch_async中无法访问全局变量:"Variable is not Assignable (missing _block type specifier)"

49

在我的 dispatch_async 代码块中,我无法访问 全局变量。我收到了这个错误:Variable is not Assignable (missing _block type specifier)

NSString *textString;

dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 
   (unsigned long)NULL), ^(void) {
        textString = [self getTextString];
});

有人可以帮我找出原因吗?


这与Xcode无关。 - user529758
1个回答

139

当你在块内修改变量时,必须使用 __block 指定符。因此,你提供的代码应该像这样:

 __block NSString *textString;
 dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 
                                                 (unsigned long)NULL), ^(void) {
      textString = [self getTextString];
});

块捕获其体内引用的变量的状态,因此被捕获的变量必须声明为可变的。考虑到您实际上是在设置这个东西,可变性正是您所需要的。


17
请注意,在 __block 中有 两个下划线 - S.Philip
但是这个解决方案仍然无用——块被异步执行一次。所以即使它可以分配给局部变量testString,谁能使用它呢?我唯一能想到的是如果在此范围内还有另一个块也使用了textString,那么它可以在稍后执行。 - newacct
你是如何得出这个结论的,没有上下文环境或者基本伪代码?你不知道 OP 可能省略了 dispatch_group 逻辑,或者在块中省略了一些周围的 KVO will/didChangeValueForKey: 调用。重点是:你错过了问题的要点。 - CodaFi
1
为全局变量分配值,__block像上面提到的那样工作得很好。这意味着我们可以在块内修改textString的值。同时,在块内访问"self"将创建一个保留周期。因此,请尝试在块内使用弱实例的self(像这样创建弱self __weak typeof(self) wkSelf = self)。 - Nikesh K

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接