请考虑下面的C++方法:
class Worker{
....
private Node *node
};
void Worker::Work()
{
NSBlockOperation *op=[NSBlockOperation blockOperationWithBlock: ^{
Tool hammer(node);
hammer.Use();
}];
....
}
当块捕获“node”时,它究竟捕获了什么?关于块的语言规范,在其他情况下是明确的: http://clang.llvm.org/docs/BlockLanguageSpec.html
在复合语句的作用域内使用的变量以正常方式绑定到块上,但自动(堆栈)存储中的变量除外。因此,一个可以按照预期访问函数和全局变量,以及静态局部变量。[testme]
在块的复合语句中引用的本地自动(堆栈)变量会被导入并作为const副本被块捕获。
但是,在这里,我们是否捕获了this的当前值?使用Worker的复制构造函数的this的副本?还是对存储node的位置的引用?
特别是,假设我们说
{
Worker fred(someNode);
fred.Work();
}
当代码块运行时,对象fred可能已经不存在了。node的值是多少?(假设底层Node对象一直存在,但Web Workers随时可能消失。)
如果我们写成:
void Worker::Work()
{
Node *myNode=node;
NSBlockOperation *op=[NSBlockOperation blockOperationWithBlock: ^{
Tool hammer(myNode);
hammer.Use();
}];
....
}
结果不同吗?
this
并具有完全相同的语义。 - newacctthis
捕获语义”。然而,一个区别在于lambda表达式不能隐式地捕获this
,这是一种良好的保护措施。 - justin