答えて

10

なぜ非同期タスクの間、強力なivarに委譲オブジェクトを割り当てるだけではないのですか?

それともexecuteAsyncWork

​​
+0

ありがとうございます。それも私の最初のアイデアでした。私は別のきちんとしたトリックがあることを望んでいた;-)。 – Alexander

+0

あり、GCDを使っています! ;-) – hypercrypt

+0

@hypercrypt:GCDは変数をハングアップさせるための解決策ではありませんが、非同期作業を実際に行うのは特に良い方法です。 – JeremyP

3

でローカル変数を持っている。このような何か:

- (void)startAsyncWork 
{ 
    id<YourProtocol> delegate = _delegate; 
    dispatch_async(/* some queue */, ^{ 
     // do work 
     [delegate doSomething]; 
    } 
} 

ブロックは、私が時折必要に応じてきた...限り、必要に応じて

31

をデリゲートを保持します手動でオブジェクトを保持したり解放したりするために(時にはデバッグのためだけに)、次のマクロを用意しました:

#define AntiARCRetain(...) void *retainedThing = (__bridge_retained void *)__VA_ARGS__; retainedThing = retainedThing 
#define AntiARCRelease(...) void *retainedThing = (__bridge void *) __VA_ARGS__; id unretainedThing = (__bridge_transfer id)retainedThing; unretainedThing = nil 

これは物事が保持されるようにする、または維持呼び出すことなく、強い参照を作成するためにどの(*無効)にしてから物事をキャストする__bridge_retainedと__bridge_transferを使用して動作します。

楽しいですが、注意してください!

+1

アークキーワードを英語の単語にするための+1 –

+0

非常にクール - ありがとう! – Anthony

+0

最初のマクロのこの部分の理由は何ですか: 'retainedThing = retainedThing'? – Anthony