उत्तर

10

क्यों अतुल्यकालिक कार्य की अवधि के लिए अपने प्रतिनिधि वस्तु को एक मजबूत ivar पर असाइन न करें?

या में 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

धन्यवाद। यह मेरा पहला विचार भी था। मैं उम्मीद कर रहा था कि एक और साफ चाल होगी ;-)। – Alexander

+0

जीसीडी का उपयोग करें! ;-) – hypercrypt

+0

@hypercrypt: जीसीडी परिवर्तनीय लटकने के लिए एक समाधान नहीं है, लेकिन वास्तव में एसिंक काम करने का यह एक अच्छा तरीका है। – 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