性能差异通过__block与非

时间:2017-08-16 06:23:14

标签: objective-c performance objective-c-blocks

将外部声明的变量带入块...

使用__block指令通过引用捕获变量...

  

使用__block存储修饰符声明的封闭词法范围的局部变量由引用提供,因此是可变的。   任何更改都会反映在封闭的词法范围中,包括在相同的词法范围内定义的任何其他块。

没有变量被值捕获......

  

在块的词法范围内声明的局部变量,其行为与函数中的局部变量完全相同。   每次调用块都会提供该变量的新副本。这些变量又可以在块中包含的块中用作const或by-reference变量。

我听说它使用__block效率较低,但这怎么可能?难道你不总是避免昂贵的副本吗?

2 个答案:

答案 0 :(得分:3)

除非变量类型是一个巨大的结构或庞大的C ++类,否则副本的成本会不高。

即使您将其声明为__block,它最初也会存储在堆栈中(如本地变量),但如果复制了使用它的任何块,它将被移动到堆中,此操作将涉及无论如何,该变量的副本。

答案 1 :(得分:2)

  

难道你不会总是避免昂贵的副本吗?

不,这不贵,因为只复制变量。变量是对象的引用,因此通常是单个机器字。

不会复制引用的对象本身。