cevap

10

Neden asenkronize görev süresi boyunca delege nesnesini güçlü bir ivar'a atamazsınız?

Ya da böyle executeAsyncWork

- (void)executeAsyncWork 
{ 
    id localCopy = _delegate; 

    if (localCopy != nil) // since this method is async, the delegate might have gone 
    { 
     // do work on local copy 
    } 
} 
+0

Teşekkür ederiz. Benim de ilk fikrim buydu. Başka bir düzgün hile olacağını umuyordum ;-). – Alexander

+0

Orada, GCD kullanın! ;-) – hypercrypt

+0

@hypercrypt: GCD, değişkeni asmak için bir çözüm değildir, ancak async çalışmasını gerçekten yapmak için özellikle iyi bir yoldur. – JeremyP

3

Something yerel bir değişken vardır:

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

gerektiği sürece temsilci koruyacaktır blok ...

31

Bazen ihtiyaç var (yalnızca hata ayıklamak için) öğeleri el ile saklamak ve bırakmak ve aşağıdaki makrolarla birlikte gelmek için:

#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 ve __bridge_transfer öğelerini kullanarak, işlerin korunmasına neden olan (void *) öğelere ve bunlardan korunmak için veya arama yapmadan güçlü bir başvuru oluşturmak için çalışır.

İyi eğlenceler, ama dikkatli olun!

+1

+1 İngilizce kelimeleri kullanan Arc anahtar kelimeleri yapmak için +1 –

+0

Çok güzel - teşekkürler! – Anthony

+0

İlk makronun bu bölümünün nedeni nedir: 'retainedThing = retainedThing'? – Anthony