5

AFAIK__blockは、ブロック内で、変数(ブロック外で宣言された)が指すアドレスを変更するときに使用されます。

しかし、変数が指している値を変更しているのにポインタが同じままである場合はどうなるでしょうか? たとえば、ブロック内でNSMutableArray *array実行しているだけの場合はどうなりますか? [array addObject:object]この場合、ポインタは変更していませんが、ポインタarrayが指す値を変更しています。それで、私はまだ__block宣言に使用しなければなりませんNSMutableArray *arrayか?

4

1 に答える 1

19

__block変数の値を変更する場合にのみ必要です。

つまり、次の場合:

NSArray* foo;

__blockの値を変更する場合にのみ必要ですfoo。さて、fooそれは「タイプされたものへのポインタ」にすぎないことに注意してNSArrayください。つまり foo、プラットフォームに応じて、実質的に 64 ビットまたは 32 ビットの整数になります。その整数を変更する場合は、が必要__blockです。そうでない場合は必要ありません__block

いいえ、実際には の値を変更していないため、配列__blockを呼び出す必要はありません。addObject:foo

のようなことをする場合はfoo = (expression);、 が必要__blockです。

(これが、OO での並行プログラミングが非常に難しい理由の 1 つであることに注意してください...特定の実行パスに対して「分散ドメイン」を定義することは非常に困難です)

于 2011-09-16T02:08:16.937 に答える