10

次の 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();
              }];
        ....
        }

結果が違う?

4

2 に答える 2

1

C++ では、node明示的に記述せずにインスタンス変数を記述するsomething->nodeと、暗黙的に になりthis->nodeます。(Objective-C での方法と同様に、node明示的に記述せずにインスタンス変数を記述するsomething->nodeと、暗黙的に になりself->nodeます。)

したがって、使用されている変数はthisであり、それthisがキャプチャされます。(技術的thisには、標準では変数ではなく、独自の独立した式の型として記述されています。しかし、すべての意図と目的のために、型の暗黙的なローカル変数として機能しますWorker *const。)すべての非__block変数と同様に、それをキャプチャすると、のconstコピーが作成されます。 this.

ブロックは、Objective-C オブジェクト ポインター型の変数をキャプチャするときに、メモリ管理セマンティクスを持ちます。ただし、thisObjective-C のオブジェクト ポインター型を持たないため、メモリ管理に関しては何も行われません。(いずれにせよ、C++ のメモリ管理に関してできることは何もありません。) そうです、 が指す C++ オブジェクトはthis、ブロックが実行されるまでに無効になる可能性があります。

于 2013-08-28T23:01:58.240 に答える