考虑以下 C++ 方法:
class Worker{
....
private Node *node
};
void Worker::Work()
{
NSBlockOperation *op=[NSBlockOperation blockOperationWithBlock: ^{
Tool hammer(node);
hammer.Use();
}];
....
}
块在捕获“节点”时究竟捕获了什么?块的语言规范http://clang.llvm.org/docs/BlockLanguageSpec.html对其他情况很清楚:
在复合语句范围内使用的变量以正常方式绑定到块,但自动(堆栈)存储中的变量除外。因此,人们可以按预期访问函数和全局变量,以及静态局部变量。[考验我]
在 Block 的复合语句中引用的本地自动(堆栈)变量由 Block 作为 const 副本导入和捕获。
但是在这里,我们是否捕获了this的当前值?使用 Worker 的复制构造函数的副本?还是对节点存储位置的引用?
特别是,假设我们说
{
Worker fred(someNode);
fred.Work();
}
当块运行时,对象 fred 可能不再存在。节点的价值是什么?(假设底层 Node 对象永远存在,但 Workers 来来去去。)
相反,如果我们写
void Worker::Work()
{
Node *myNode=node;
NSBlockOperation *op=[NSBlockOperation blockOperationWithBlock: ^{
Tool hammer(myNode);
hammer.Use();
}];
....
}
结果不一样吗?