4

私は自分自身をキャプチャするときに強い参照サイクルを避ける必要があると言って、Apple's documentationに気づいた。Objective-Cでは弱い自己をブロックで使用する必要がありますか?

この例のブロックは、自己のプロパティです。

しかし、dispatch_asyncステートメントにブロックをローカル変数として配置するとどうなりますか?

この場合、自己のメソッドを直接呼び出しても保持サイクルは作成されません。

this articleにweakSelfを生成する次のコードはありますか?与えられた例では

// your code 
__weak typeof(self) weakSelf = self; 
dispatch_async(dispatch_get_main_queue(), ^{ 
    __strong typeof(weakSelf) strongSelf = weakSelf; 
    if (strongSelf) { 
     [strongSelf doThis]; 
     [strongSelf doThat]; 
     [Manager.sharedInstance updateSuccessCount]; 
    } 
}); 

// more code 
+2

関連するコードとあなたの質問を更新します。コールバックが呼び出されたときにブロック自体がリリースされているので – rmaddy

+0

そうだね、これはサイクルにはなりません。しかし、コールバックが変数に格納されている場合は、いつ解放されるのかを検討する必要があります。 'self.block'が再割り当てされるか' self'が解放されたとき、Appleの例で は、ブロックのみが解放されます。しかし、 'self'は決して解放されません。なぜなら、ブロックからの参照はまだずっと残っているからです。 –

+0

@rmaddyこんにちは、ここでコードを更新しました。 –

答えて

5

dispatch_asyncを使用して、強く、ここselfをキャプチャするのが安全だろうので何も、サイクルを保持はないだろう。唯一の違いは、selfが間に他のすべてでリリースされた場合は、このdispatch_asyncが呼び出されたとき、ということでしょうし、ブロックが実際に実行したときに、それは少しその短い時間のためにselfの実際の割り当て解除を遅らせるだろう、と解放が実際に発生したスレッド影響を及ぼす可能性があります同じように。しかし、一般的には、dispatch_asyncを使用するとどちらの方法でも問題ありません。

あなたの例が上に書かれているようにしたい場合は、ブロック内で実行されるコードが多少高価で、絶対に必要な場合にのみ実行したい場合、そしてselfが既にあった場合は不要です他のすべてによってリリースされました。 selfが大量のメモリを使用し、何か他のものは、多くのメモリを消費する開始する前に、通常、右の割り当てを解除入った場合

別のケースであってもよいです。その場合、2つのインスタンスを同時に割り当てることは望ましくありません。

+0

お役立ち情報仰るとおりです。ありがとう –

関連する問題