2017-08-16 26 views
2

当把外部声明的变量成块......性能差异通过__block捕捉块外部变量VS那不

使用__block指令捕捉引用变量...

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

没有变量由值而拍摄...

块的词法范围内声明的局部变量,这完全一样的功能,局部变量。 块的每次调用都会提供该变量的新副本。这些变量可以反过来用作块内封闭块的const或by-reference变量。

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

+0

相关:[块如何捕获其封闭范围之外的变量?](https://stackoverflow.com/questions/17813870/how-does-a-block-capture-the-variables-outside-of - 封闭范围/ 17819142#17819142) –

回答

2

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

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

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

+0

大声笑我总是忘记这一点。苹果让它变得如此简单。与编写C++时相比。 – Gukki5

3

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

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