Objective c dipatch_async释放局部变量

Objective c dipatch_async释放局部变量,objective-c,multithreading,cocoa,objective-c-blocks,Objective C,Multithreading,Cocoa,Objective C Blocks,我在网上没有找到任何合适的答案,所以我把我的问题贴在这里 __block int test = 1; dispatch_async(dispatch_get_main_queue(), ^{ test = 2; }); NSLog(@"%i",test); 此代码将导致控制台消息1 __block NSString *test = @"no"; dispatch_async(dispatch_get_main_queue(), ^{ test = @"yes"; }); NSL

我在网上没有找到任何合适的答案,所以我把我的问题贴在这里

__block int test = 1;
dispatch_async(dispatch_get_main_queue(), ^{
    test = 2;
});
NSLog(@"%i",test);
此代码将导致控制台消息1

__block NSString *test = @"no";
dispatch_async(dispatch_get_main_queue(), ^{
    test = @"yes";
});
NSLog(@"%@",test);
此代码将导致控制台消息no

为什么会这样?我认为块标识符应该解决这种情况下的所有问题。 我的假设是局部变量被复制,块内的代码实际上并没有修改自身之外的任何内容

如何修改dispatch\u async内部的局部变量

对不起,如果这是一个noob问题

您正在异步调度到主队列

dispatch_async在块同时执行之前返回

要强调非确定性并发编程的重要性,请执行以下操作:

请注意,您的NSLog有时可能会看到新值,可能是千载难逢的。您可能从未在调试环境中看到过这种行为,但一些客户可能会在3年后的系统配置中遇到这种行为,而这种系统配置在今天并不存在

修理

dispatch_sync,从而确保后台队列和主队列有效地像效率较低的单个串行队列一样工作

。。。或者

当操作完成时,使用某种同步构造将消息从主队列发送回本地队列。即:

dispatch_async(otherQueue, ^{
     ... do something ...;
     dispatch_async(firstQueue, ^{
          done(calculatedValue);
     };
};

您正在调用dispatch\u async。虽然您正在主线程上执行代码,但仍然无法确定是否在NSLog@%@,test之前执行代码test=@yes;代码


如果使用dispatch\u sync,它将像expexted一样工作。

您正在异步调度设置测试,这意味着您的NSLog语句将在块之前触发

您必须这样做,或者将其更改为dispatch\u sync

__block NSString *test = @"no";
dispatch_async(dispatch_get_main_queue(), ^{
  test = @"yes";
  NSLog(@"%@",test);
});
如果需要在后台线程上执行某些操作,然后将其弹出到主线程上,只需执行以下操作:

__block NSString *test = @"no";
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
   test = @"setting Testing in the background";
   NSLog(@"Printing from the background:%@",test);
   dispatch_async(dispatch_get_main_queue(), ^{
    test = @"Setting Test on the main thread";
    NSLog(@"Logging test on the main thread:%@",test);
   });
});

多谢各位!现在我能理解这个问题了。太好了!并发性很难是每个程序员都应该牢记的一句箴言!是的,没错,我只是想表现出不同。请看bbum的代码示例,了解如何保持异步-