20

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

typedef void (^MyResponseHandler) (NSError *error); 
@interface MyClass : NSObject 
{ 
    MyResponseHandler _ivarResponseHandler; 
} 

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

प्रश्न: जब इवर करने के लिए आवंटित ब्लॉक स्वचालित रूप से ढेर में कॉपी किया है?

My previous question ने बताया कि @property के माध्यम से असाइन किए जाने पर इसकी प्रतिलिपि बनाई गई है। लेकिन, आज मैंने उपर्युक्त कोड का उपयोग किया और प्राप्त किया जो

_ivarResponseHandler = [responseHandler copy] पर बदलकर तय किया गया था।

उत्तर

4

आपकी समस्या और समाधान इंगित करता है कि आपके अन्य प्रश्न का मेरा उत्तर शायद गलत था।

एक __strong पैरामीटर चर आरंभ या एक __weak चर, जब भी इन अर्थ विज्ञान block- के एक मूल्य बनाए रखने के लिए कॉल पढ़ने के हिस्से के रूप में किया रखती है के अपवाद के साथ: मैं यह खंड 7.5 के अंतिम पैरा the clang Objective-C Automatic Reference Counting documentation के आधार पर सूचक प्रकार, इसका Block_copy का प्रभाव है। ऑप्टिमाइज़र ऐसी प्रतियों को हटा सकता है जब यह देखता है कि परिणाम केवल कॉल के लिए तर्क के रूप में उपयोग किया जाता है।

मैं "इन अर्थ विज्ञान" लिया पूरे दस्तावेज़ मतलब करने के लिए, लेकिन अगर "इन अर्थ विज्ञान" के लिए एक ही अनुभाग 7.5 को संदर्भित करता है, तो एआरसी केवल एक Block_copy एक ब्लॉक है कि एक ब्लॉक द्वारा कब्जा कर लिया है के लिए सम्मिलित करता है।

+0

मैं मानता हूं कि यह स्पष्ट नहीं है कि "इन अर्थशास्त्र" – sbooth

+0

+1 का जिक्र कर रहे हैं, अनुभाग शब्द अविश्वसनीय रूप से भ्रमित है। – orip

+3

मैंने ऐप्पल इंजीनियर से बात की जिसने इस खंड को लिखा था। उन्होंने कहा "इन अर्थशास्त्र" पूरे दस्तावेज़ को संदर्भित करता है। इस प्रकार एक 'block_copy' स्वचालित रूप से डाला जाना चाहिए। ऐसा लगता है कि शायद यह बाद में तय किया गया था कि ब्लॉक के साथ यह एक बग था। – bearMountain

10

संपादित करें: मेरे पिछले जवाब की संभावना गलत था।

ARC docs से कुछ चुने हुए अंश कहते हैं:

3. retainable वस्तु संकेत

एक retainable वस्तु सूचक (या retainable सूचक) एक retainable वस्तु सूचक प्रकार (retainable प्रकार) के एक मूल्य है।

  • ब्लॉक संकेत (एक समारोह प्रकार के कैरेट (^) declarator sigil लगाने से गठन)

4,2: retainable वस्तु सूचक प्रकार के तीन प्रकार होते हैं। सेमेन्टिक्स

असाइनमेंट ऑपरेटर का मूल्यांकन करते समय असाइनमेंट होता है। अर्थशास्त्र योग्यता के आधार पर भिन्न होता है:

  • __strong ऑब्जेक्ट्स के लिए, नया पॉइंटी पहले बनाए रखा जाता है; दूसरा, आभासी आदिम अर्थशास्त्र से भरा हुआ है; तीसरा, नया पॉइंटी मूलभूत अर्थशास्त्र के साथ लालू में संग्रहीत किया जाता है; और अंत में, पुरानी पॉइंट जारी की गई है। यह परमाणु रूप से प्रदर्शन नहीं किया जाता है; बाहरी सिंक्रनाइज़ेशन का उपयोग समवर्ती भार और दुकानों के सामने सुरक्षित बनाने के लिए किया जाना चाहिए।

4.4.1।ऑब्जेक्ट्स

यदि किसी ऑब्जेक्ट को बनाए रखने योग्य ऑब्जेक्ट स्वामी प्रकार के साथ घोषित किया गया है, लेकिन एक स्पष्ट स्वामित्व क्वालीफायर के बिना, इसका प्रकार __strong योग्यता के लिए पूरी तरह से समायोजित किया गया है।

7.5। ब्लाकों

एक __strong पैरामीटर चर आरंभ या एक __weak चर, जब भी इन अर्थ विज्ञान ब्लॉक सूचक प्रकार का एक मूल्य बनाए रखने के लिए कॉल पढ़ने के हिस्से के रूप में किया रखती है के अपवाद के साथ

, यह एक Block_copy का प्रभाव पड़ता है। ऑप्टिमाइज़र ऐसी प्रतियों को हटा सकता है जब यह देखता है कि परिणाम केवल कॉल के लिए तर्क के रूप में उपयोग किया जाता है।

तो मुझे लगता है कि उत्तर शायद, अनुकूलक के आधार पर है।

+0

क्या आप जानते हैं कि मैं एक स्वचालित संदर्भ गणना पर्यावरण के संदर्भ में पूछ रहा हूं? ऐसा लगता है कि आपका foo/bar उदाहरण एआरसी में कोई समस्या नहीं होगी ...? – bearMountain

+0

हाँ, क्षमा करें। आपका उत्तर, या आपूर्ति किए गए सेब दस्तावेज इस बात के बारे में कुछ भी नहीं कहता है कि एआरसी स्वचालित रूप से एक ब्लॉक को एक आवृत्ति परिवर्तक को आवंटित करते समय ढेर में ले जाता है या नहीं। ऐसा लगता है कि इस प्रश्न का उत्तर [क्लैंग उद्देश्य-सी स्वचालित संदर्भ गणना दस्तावेज] से आना होगा (http://clang.llvm.org/docs/AutomaticReferenceCounting.html#misc.blocks)। – bearMountain

+0

@bearMountain आप सही हैं, मैंने अपना जवाब ठीक करने का प्रयास किया है। – sbooth

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

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