gpt4 book ai didi

objective-c - dipatch_async 释放局部变量

转载 作者:行者123 更新时间:2023-12-03 17:28:03 26 4
gpt4 key购买 nike

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

__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);

此代码将导致控制台消息“否”。

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

如何修改dispatch_async中的局部变量?

抱歉,如果这是一个菜鸟问题。

最佳答案

您正在异步分派(dispatch)到主队列。

dispatch_async 在 block 执行之前返回(巧合)。

强调非确定性并发编程的可能性:

请注意,您的 NSLog() 有时可能会千载难逢地看到新值。您可能在调试环境中看不到它,但某些客户可能会在 3 年后在今天不存在的系统配置上遇到这种行为。

修复?

dispatch_sync() 从而确保您的后台队列和主队列有效地充当效率较低的单个串行队列。

...或...

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

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

关于objective-c - dipatch_async 释放局部变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16626769/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com