- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
我想知道如何在方法的上下文中访问 __block
限定的 var 线程安全。
例子:
__block NSMutableDictionary *dictionary = [NSMutableDictionary dictionary];
for (int i=0; i<20; i++) {
NSBlockOperation *operation = [NSBlockOperation blockOperationWithBlock:^{
[dictionary setObject:@"test" forKey:@"test"];
}];
[someConcurrentQueue addOperation:operation];
}
此处操作被添加到并发队列中,dictionary
var 可能是同时从不同的线程访问。
这样安全吗?如果不是,我如何才能安全地访问 dictionary
?
最佳答案
正如 UIAdam 在他的评论中所说,__block
在这里没有为您做任何事情;你正在改变字典,而不是分配给变量。该变量将永远指向同一个字典。
事实上,__block
在这里可能会伤害到你,因为它意味着变量不会被 block 捕获。如果你不使用 ARC,这意味着字典将不会被保留,并且该 block 可能很快就会向死对象发送消息。我不确定 ARC 是否改变了这一点。无论如何,你应该离开这个变量的 __block
;如果没有别的,代码可以更清楚地表达您的意图。
至于你的实际问题,关于线程安全,这段代码是不安全的。 According to the Thread-Safety Summary ,可变集合类不是线程安全的:您必须一次从不超过一个线程向可变集合发送消息。同步是一种方式; setting the queue's max concurrent operation count到 1 将是另一个。
关于Objective-C __block 关键字和线程安全,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9451442/
我正在使用这个 findAllMessages() 函数来返回一个 NSString ,其中包含有关每条消息的信息。 一切顺利,直到我走出 block 并且 concatenatedMessage 字
将外部声明的变量引入 block 时... 使用__block指令通过引用捕获变量... Variables local to the enclosing lexical scope declared
现在我正在开发一个横幅,显示 iOS 中的功能它是一个单例,当用户登录时,它会在屏幕的上部显示横幅。 它基本上是一个带有类方法 showWithName 的共享 View ... @interface
我正在尝试搜索提醒列表以检查是否存在提醒。方法中有一个选项可以保存提醒是否存在的值。我正在使用一个 block ,在 block 内,当找到提醒时,新值被分配给 reminderExists 变量,就
我正在尝试将 block 内的结果分配给 block 变量。这是我的代码: __block UIImage *latestImage; ALAssetsLibrary *assetLibrary =
已关闭。此问题需要 debugging details 。目前不接受答案。 编辑问题以包含 desired behavior, a specific problem or error, and the
我应该声明为 (#1) 类名 * __ block 变量名 或 (#2) __block 类名 * 变量名 ? 我看到很多代码使用格式 #2,包括 Apple 的 Blocks Programming
我使用 AFNetworking 库已经有一段时间了,我刚刚遇到了一个问题。我使用了以下代码,它使用 GET 函数从远程 PHP 文件接收数据。 AFHTTPSessionManager *manag
在ARC中,下面这行代码有意义吗?请确认。 __block __weak MyViewController_iPad *blockSelf = self; 这不会抛出任何错误。不知道为什么。 考虑以下
我很困惑为什么我的全局变量在通过一个 block 后不能再次访问它。这是我的代码: __block NSString *latitude; __block NSString *longitude; C
这个问题在这里已经有了答案: Completion handlers and return values (1 个回答) 关闭 9 年前。 我有以下代码: - (Transporter *) get
我必须修复一些使用 LLVM(在 iOS 上)构建得很好的现有代码,以便它也可以使用 llvm-gcc-4.2 构建。除了在几个地方发现的这种模式外,我几乎完成了所有工作: @property (no
我在编译 Objective-C 类时遇到了以下错误: VideoView.h:7: error: __block attribute can be specified on variables on
我有以下代码片段: -(void) doSomething { __block NSMutableArray *objArray = [[NSMutableArray alloc] initW
我可以使用 __block 说明符在堆栈上指定一个变量,然后我可以在一个 block 中修改它。我只是想知道,幕后发生了什么? (如果该 block 在未来的某个时间执行,则堆栈可能会被清除) 最佳答
我想知道如何在方法的上下文中访问 __block 限定的 var 线程安全。 例子: __block NSMutableDictionary *dictionary = [NSMutableDicti
我对 __block 变量的语法有疑问。我知道您可以在范围内的变量上使用 __block ,因此它在 block 内不是只读的。然而在apple docs中的一个位置,我看到了一个替代方案: "Var
Objective-C 中的 __block 关键字究竟是什么意思?我知道它允许您修改 block 内的变量,但我想知道... 它究竟告诉编译器什么? 它还有其他作用吗? 如果仅此而已,那么为什么首先
我想创建以下类方法: +(void) getValue4Key:(NSString*)p_key andSet:(id)p_variable { NSString *baseURLStr
在阅读 NotificationCenter 文档时,我发现了下面的示例代码。我想澄清的是 __block 在这里是什么意思?我知道何时使用 __block 变量可以在块中更改,但 token 不会更
我是一名优秀的程序员,十分优秀!