objective-c – 在调度队列中修改父作用域中的数据
根据并发编程指南:
我一直在改变在队列外部创建的变量,但是我从来没有用__block指定它们,所以我想知道究竟何时或为什么需要它.或者是实例变量总是固有地可以被块改变,就好像它们从幕后分配给它们__block一样? 更新:我也应该添加我正在使用异步队列,而上面说只能在同步队列中改变变量(使用__block) 解决方法
在块中访问类的实例变量iVar将被编译器解释为self-> iVar.因此,块捕获自身,不会被修改.
我确信__block修饰符也适用于dispatch_async,因此这可能是文档错误. 添加 以下示例显示__block变量如何与dispatch_async一起使用: dispatch_queue_t queue = dispatch_queue_create("myQueue",DISPATCH_QUEUE_CONCURRENT); __block int total = 0; printf("address of total: %pn",&total); // dispatch some (concurrent) blocks asynchronously: dispatch_async(queue,^{ OSAtomicAdd32(5,&total); }); dispatch_async(queue,^{ OSAtomicAdd32(7,&total); }); // Wait for all blocks to complete: dispatch_barrier_sync(queue,^{ }); printf("address of total: %pn",&total); printf("total=%dn",total); 输出: address of total: 0x7fff5fbff8f0 address of total: 0x100108198 total=12 可以看到,在执行块时,total会从堆栈复制到堆栈. 添加 我刚刚在Blocks Programming Guide中找到了它.它解释了为什么将__block变量与异步块一起使用没有问题.
(编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |