8

मान लेंएआरसी के तहत, संपत्ति के माध्यम से एक इवर को सौंपा गया जब ब्लॉक स्वचालित रूप से प्रतिलिपि बनाई जाती हैं?

typedef void (^MyResponseHandler) (NSError *error); 
@property (strong, nonatomic) MyResponseHandler ivarResponseHandler; 
synthesize ivarResponseHandler = _ivarResponseHandler; 

- (void)myMethod:(MyResponseHandler)responseHandler 
{ 
    self.ivarResponseHandler = responseHandler; 
    ... 
} 

@property सही माध्यम इवर लिए काम है? मुझे पता है कि मैन्युअल मेमोरी मैनेजमेंट में आपको यह सुनिश्चित करने के लिए self.ivarResponseHandler = [responseHandler copy]; की आवश्यकता होगी ताकि ब्लॉक को ढेर से ढेर तक कॉपी किया गया हो। लेकिन सत्र 322 देखना - डब्ल्यूडब्ल्यूडीसी 2011 से गहराई (मिनट 25) में उद्देश्य-सी अग्रिम, स्पीकर का कहना है कि एआरसी स्वचालित रूप से एक ब्लॉक को एक ivar के असाइनमेंट को संभालता है। मैं बस सुनिश्चित करना चाहता था।

उत्तर

2

bearMountain,

ब्लॉक कॉपी किया जाता है सुनिश्चित करने के लिए सबसे आसान तरीका है, वास्तव में, प्रतिलिपि का उपयोग करने के लिए @property सेट करें। जैसा कि:

@property (copy, nonatomic) MyResponseHandler ivarResponseHandler; 

यह सब कुछ आपको चाहिए।

एंड्रयू

+0

सीधे सवाल का जवाब नहीं देता है। लेकिन मुझे लगता है कि मैं अब इस कोड का उपयोग अपने कोड में करूँगा। – bearMountain

+0

(दो साल बाद) मैंने अभी भी बहुत ही समान प्रश्न पूछा है जो आपके उत्तर देता है: [क्या मुझे अभी भी एआरसी के तहत ब्लॉक को ब्लॉक/ब्लॉक करना चाहिए?] (Http://stackoverflow.com/questions/23334863)। उत्तर का सामान्य निष्कर्ष यह है कि ब्लॉक के लिए गुण लिखने के लिए फॉर्म, यहां इस स्वीकृत उत्तर में, वर्तमान दिनों में भी बिल्कुल सही और सही रूप है। –

11

एआरसी स्वचालित रूप से आपके द्वारा पोस्ट किए गए कोड में आपके लिए प्रतिलिपि करेगा।

यदि आप ब्लॉक को id पर रूपांतरित करते हैं, तो एआरसी आपके लिए प्रतिलिपि नहीं करेगा। उदाहरण के लिए, इस कोड में, एआरसी प्रतिलिपि क्योंकि addObject: तर्क प्रकार id है प्रदर्शन नहीं करेगा:

NSMutableArray *array = [NSMutableArray array]; 
[array addObject:responseHandler]; 
+0

बहुत बहुत धन्यवाद। मेरे प्रश्न और अधिक जवाब दिया। – bearMountain

+0

@adonoho क्या यह सच है कि [यदि सीधे एक ivar को असाइन किया गया है तो ब्लॉक स्वचालित रूप से कॉपी नहीं किया गया है] (http://stackoverflow.com/questions/10453261/under-arc-are-blocks-automatically-copied-when-assigned- टू-एक-इवर-सीधे)? – bearMountain

+0

भालूमाउंटन, मुझे नहीं पता कि यह एक इवर को सौंपा जाने पर क्या होता है। वाकई, मैं वास्तव में इस बात पर निर्भर नहीं होना चाहता कि संकलक क्या करने जा रहा है। मुझे पता है कि प्रतिलिपि '@ प्रॉपर्टी' को आवंटित करते समय इसकी प्रतिलिपि बनाई जाती है। मुझे यह भी पता है कि आप सीधे आईवर को असाइनमेंट पर ब्लॉक को कॉपी कर सकते हैं। दोनों मामलों में, कोई अस्पष्टता नहीं है। मैं हमेशा '@ संपत्ति का उपयोग करना पसंद करता हूं। एंड्रयू – adonoho

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

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