gpt4 book ai didi

objective-c - 编译器不会将每个变量都视为 __block 变量的原因是什么?

转载 作者:太空狗 更新时间:2023-10-30 03:52:50 26 4
gpt4 key购买 nike

不将每个变量都视为 __block 变量的编译器(特别是 Xcode 使用的编译器)的性能提升是什么?我想一定有什么东西,我怀疑在 __block 变量的概念中决定了

 __block SelfClass * blockSelf = self;

是一种很好的方便的语法。

最佳答案

block 的目标是尽可能自动和透明地使用具有最少语法的 block 并让它们“正常工作”。

非 __block 变量,作为默认值,更符合 block 所代表的“闭包”概念。在执行通过 block 声明时, block 会快照 block 内引用的所有变量的状态。这包括内存/状态的复制和保留 block 中捕获的任何 Objective-C 对象引用。

__block 有效地打破了 block 内状态的封装。非常有用,但需要程序员手动管理对象引用。

即非 __block 变量比 __block 变量更频繁地“正常工作”,因此,默认行为倾向于“正常工作”。

在实践中,捕获 block 内状态的成本通常是最小的。对应用性能的可衡量影响通常很少见,并且通常表明存在更深层次的架构问题。


如果通过:

 __block SelfClass * blockSelf = self;

您指的是 Blocks 和 ARC 的叉积吗?是的,这有点不幸。但是编译器还警告了一个您需要注意的非常现实的问题。但是,更简洁的解决方法显然更可取。

关于objective-c - 编译器不会将每个变量都视为 __block 变量的原因是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7949549/

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