9

それが完了ハンドラでいくつかのものを行うと、ハンドラでそれを解放させ、オブジェクトを割り当てるために私のコードでは一般的なパターンです: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]; 
}]; 

を...しかし、コードはもう再入ではないでしょう。

答えて

4

ほとんどの場合、動作するはずです(つまり、何かがfooの内部を参照する場合、fooはそのコードを満たすために十分長く続く)。

__block LongOperation* foo = [[LongOperation alloc] init]; 
[foo runWithCompletion:^{ 
    // do some things 
    foo = nil; 
}]; 

注これは、このパターンの反対のようなものです:弱参照と、それは離れて行く必要がありますが、ハンドラを実行した後、あなたのような何かをできるようになるまではならないようにfooが見えるように問題がある場合オブジェクト/ not /が管理されたメモリルールの下でキャプチャされます。

+0

これは質問に答えることができませんfooを含むコンテキストが長くなったときに何をするかです。このソリューションでは、[foo runWithCompletion:]を呼び出すスタックフレームは、実行が完了するまで、またはスタックがよりスマートになるまでブロックする必要があります。 –

関連する問題