【问题标题】:Unable to access global variables in dispatch_async : "Variable is not Assignable (missing _block type specifier)" [duplicate]无法访问 dispatch_async 中的全局变量:“变量不可分配(缺少 _block 类型说明符)”[重复]
【发布时间】:2012-07-05 11:34:40
【问题描述】:

在我的 dispach_async 代码 block 中,我无法访问 global variables。我收到此错误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无关。

标签: ios objective-c multithreading objective-c-blocks grand-central-dispatch


【解决方案1】:

当您修改块内的变量时,您必须使用 __block 说明符,因此您提供的代码应如下所示:

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

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

【讨论】:

  • 请注意__block中有两个下划线
  • 但是这个方案还是没用——块异步执行一次。所以即使它可以分配给局部变量testString,谁可以使用它?我唯一能想到的是,如果这个范围内还有另一个块也使用textString,可以稍后执行。
  • 没有周围的上下文,或者基本上不是伪代码的代码,你是怎么做出这个决定的?如您所知,OP 可能省略了 dispatch_group 逻辑,或者可能是块中的一些周围的 KVO will/didChangeValueForKey: 调用。重点是:你错过了问题的重点。
  • 为全局变量 __block 赋值,如上所述。这意味着,我们可以修改块内 textString 的值。同时,访问块内部的“self”会创建一个retain循环。所以尝试在块内使用弱的 self 实例(像这样创建弱的自我 __weak typeof(self) wkSelf = self)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-09-15
  • 2020-01-15
  • 1970-01-01
  • 2016-05-23
  • 2015-12-02
  • 1970-01-01
  • 2014-01-17
相关资源
最近更新 更多