将外部声明的变量带入块...
使用__block
指令通过引用捕获变量...
使用__block存储修饰符声明的封闭词法范围的局部变量由引用提供,因此是可变的。 任何更改都会反映在封闭的词法范围中,包括在相同的词法范围内定义的任何其他块。
没有变量被值捕获......
在块的词法范围内声明的局部变量,其行为与函数中的局部变量完全相同。 每次调用块都会提供该变量的新副本。这些变量又可以在块中包含的块中用作const或by-reference变量。
我听说它使用__block效率较低,但这怎么可能?难道你不总是避免昂贵的副本吗?
答案 0 :(得分:3)
除非变量类型是一个巨大的结构或庞大的C ++类,否则副本的成本会不高。
即使您将其声明为__block
,它最初也会存储在堆栈中(如本地变量),但如果复制了使用它的任何块,它将被移动到堆中,此操作将涉及无论如何,该变量的副本。
答案 1 :(得分:2)
难道你不会总是避免昂贵的副本吗?
不,这不贵,因为只复制变量。变量是对象的引用,因此通常是单个机器字。
不会复制引用的对象本身。