5

AFAIK、__blockは、ブロック内で(ブロックの外で宣言された)変数が指すアドレスをブロック内で変更しているときに使用されます。__blockを使用する必要があるときにARCが教えてくれますか?

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

答えて

19

変数の値を変更する場合は、__blockが必要です。

I.e.あなたが持っている場合:

NSArray* foo; 

をあなたはfooの値を変更する場合にのみ__blockを必要としています。さて、fooは "NSArray"という型のポインタです。私。 fooは、実質的にプラットフォームに応じて64ビットまたは32ビットの整数です。その整数を変更する場合は、__blockが必要です。そうしないと、__blockは必要ありません。

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

foo = (expression);のような操作を行う場合は、__blockが必要です。

(任意の実行パスは、「分散のドメイン」を定義するために非常に難しいです...これはOOの下で並行プログラミングを懸命にのろわれている理由の一つであることに注意してください)

+0

何コンパイラの最適化について? '__block'は、オブジェクトが決して変更されないことを示唆し、' NSArray'がインライン化された場合、その後のcapacityの呼び出しが間違っている可能性があります。 – Dani

+2

'__block'は変数が変更可能であることを示します。変数が '__block'かconst-copy(デフォルトのように)であるかどうかにかかわらず、オブジェクトのメソッドを呼び出すことは影響を受けません。 – bbum

+0

しかし、変数(NSArray *)が自己プロパティの場合はどうなりますか? __blockを追加する必要がありますか? – Amnysia

関連する問題