Objective-C で ARC を使用しているときに、いつブロックをコピーする必要があるかについて、矛盾する情報を取得しています。アドバイスは「常に」から「決して」までさまざまなので、どうすればよいかわかりません。
たまたま、説明の仕方がわからないケースがあります。
-(RemoverBlock)whenSettledDo:(SettledHandlerBlock)settledHandler {
// without this local assignment of the argument, one of the tests fails. Why?
SettledHandler handlerFixed = settledHandler;
[removableSettledHandlers addObject:handlerFixed];
return ^{
[removableSettledHandlers removeObject:handlerFixed];
};
}
これは、次のようなインライン ブロックで呼び出されます。
-(void) whatever {
[self whenSettledDo:^(...){
...
}];
}
ここで引数をローカル変数にコピーすると何が変わるでしょうか? addObject 用と removeObject 用の 2 つの異なるコピーを作成するローカルのないバージョンなので、削除されたコピーは追加されたコピーと一致しませんか?
ARC がブロックを正しく処理しないのはなぜですか? それは何を保証し、私の責任は何ですか?これらすべてが曖昧でない方法で文書化されているのはどこですか?