次の 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は、他の場合について明確です。
複合ステートメントのスコープ内で使用される変数は、自動 (スタック) ストレージ内の変数を除いて、通常の方法でブロックにバインドされます。したがって、静的なローカル変数だけでなく、期待どおりに関数とグローバル変数にアクセスできます。[試してください]
ブロックの複合ステートメント内で参照されるローカル自動 (スタック) 変数は、ブロックによって const コピーとしてインポートおよびキャプチャされます。
しかし、ここで、 thisの現在の値を取得しますか? ワーカーのコピー コンストラクターを使用してこれをコピーしますか? または、ノードが格納されている場所への参照ですか?
特に、次のように言うとします。
{
Worker fred(someNode);
fred.Work();
}
ブロックが実行されると、オブジェクト fred はもはや存在しない可能性があります。ノードの値は? (基礎となる Node オブジェクトは永久に存続すると仮定しますが、Workers は行き来します。)
代わりに私たちが書いた場合
void Worker::Work()
{
Node *myNode=node;
NSBlockOperation *op=[NSBlockOperation blockOperationWithBlock: ^{
Tool hammer(myNode);
hammer.Use();
}];
....
}
結果が違う?