それが完了ハンドラでいくつかのものを行うと、ハンドラでそれを解放させ、オブジェクトを割り当てるために私のコードでは一般的なパターンです:ARCでブロック補完ハンドラを使用してオブジェクトを解放するにはどうすればよいですか?
LongOperation *foo = [[LongOperation alloc] init];
[foo runWithCompletion:^{
// run some code and then:
[foo autorelease];
}];
これはかなりうまく動作しますが、私は、コードを変換しようとするとXcodeはARCに対して、ブロックからautorelease
を単に落とすことはできないと苦情を言います。これは、foo
オブジェクトがスコープを離れると割り当てが解除されるためです。
ARCでこのようなパターンを書くにはどうすればよいでしょうか?私はfoo
のインスタンス変数を導入できます。
[self setFoo:[[LongOperation alloc] init]];
[foo runWithCompletion:^{
// run some code and then:
[self setFoo:nil];
}];
を...しかし、コードはもう再入ではないでしょう。
これは質問に答えることができませんfooを含むコンテキストが長くなったときに何をするかです。このソリューションでは、[foo runWithCompletion:]を呼び出すスタックフレームは、実行が完了するまで、またはスタックがよりスマートになるまでブロックする必要があります。 –