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

Eri*_*c L 5 xcode objective-c clang objective-c-blocks

编译器(特别是Xcode使用的编译器)没有将每个变量都视为__block变量的性能提升有哪些?我想有必要有一些东西,我怀疑在__block变量的构思期间,它已经决定了

 __block SelfClass * blockSelf = self;
Run Code Online (Sandbox Code Playgroud)

是非常方便的语法.

bbu*_*bum 4

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

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

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

即,非 __block 变量“正常工作”更常见于 __block 变量,因此,默认行为是倾向于“正常工作”。

实际上,捕获块内状态的成本通常是最小的。对应用程序性能的可衡量影响通常很少见,并且通常表明存在更深刻的架构问题。


如果通过:

 __block SelfClass * blockSelf = self;
Run Code Online (Sandbox Code Playgroud)

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