2011-01-12 12 views
10

यदि मैं इस ^{ DoSomething; } जैसे ब्लॉक की घोषणा करता हूं और इसे एक आवृत्ति चर में डालता हूं, तो क्या मुझे इसे Block_copy() की आवश्यकता है यदि मैं इसे चारों ओर रखने जा रहा हूं?उद्देश्य-सी ब्लॉक autoreleased हैं?

+0

नोट .. एआरसी के लिए, कुछ उदाहरण कोड यहां है: http://stackoverflow.com/a/20760583/294884 – Fattie

उत्तर

10

हां, आपको प्रतिलिपि बनाने की आवश्यकता है। ऐसा इसलिए नहीं है क्योंकि वे ऑटोरेलेज्ड हैं, लेकिन क्योंकि वे ढेर पर शुरू होते हैं। ध्यान दें कि ब्लॉक भी है ताकि आप उन्हें नियमित copy संदेश का उपयोग कर कॉपी कर सकते हैं, नियमित रूप से ऑब्जेक्टिव-सी वस्तुओं की तरह व्यवहार करते हैं:

void storeBlockForLater: (dispatch_block_t) block 
{ 
    [someArray addObject:[[block copy] autorelease]]; 
} 

या, यदि आप एक ब्लॉक संपत्ति है:

@property(copy) dispatch_block_t block; 

बनाए रखने की नहीं है यहां मदद करें

+2

धन्यवाद, मुझे इस विषय पर भी इस महान लेख को मिला: http://cocoawithlove.com/2009 /10/how-blocks-are-implemented-and.html – brian

+1

युप; और यदि आप 'प्रतिलिपि' का उपयोग करते हैं, तो 'रिलीज' का उपयोग करें। यदि आप 'ब्लॉक_copy() 'का उपयोग करते हैं, तो' block_release()' का उपयोग करें। मिश्रण मत करो। – bbum

+0

@bbum क्या यह 'block_copy()' और 'autorelease' का उपयोग सुरक्षित है? क्या आपको 'प्रतिलिपि' का उपयोग केवल 'प्रतिलिपि' के साथ करना चाहिए? –

संबंधित मुद्दे