Thursday 15 September 2011

objective c - Why aren't objects released when referencing them using __weak outside of an autorelease pool? -


इस सवाल का पहले से ही एक उत्तर है: < / P>

  • 4 जवाब

    निम्न कोड में, जो एआरसी है और मैक ओएस एक्स 10.8.4 पर 64-बिट चल रहा है, कार्यक्रम समाप्त होने से पहले MyObj का आवंटन रद्द नहीं किया जा रहा है?

      #import & lt; फाउंडेशन / फाउंडेशन। एच & gt ; @ इंटफेस मायऑब्ज़: एनएसओबैजेट @ एक्सपोर्ट @ माइॉल - (रिक्त) डेलोक {एनएसएलॉग (@ "माइऑज़ डेलोकैड% पी", स्वयं); } @ अंत इंट मुख्य (इंट आर्जिक, कॉन्स्ट चार् * आर्जवी []) {मायओबज * ओजज 1 = [[मायऑब आलोक] इनिट]; __weak MyObj * weakObj1 = obj1; एनएसएलॉग (@ "इसे प्रयोग करें:% पी \ n", कमजोर ओबेज 1); // MyObj यहाँ क्यों नहीं हटाया गया है? वापसी 0; }    

    __ कमजोर उद्देश्य-सी रनटाइम फ़ंक्शन objc_loadWeak पर निर्भर करता है। क्लैग 3.4 के लिए दस्तावेज़ में उद्देश्य-सी स्वचालित संदर्भ गणना से:

    आईडी objc_loadWeak (id * object);

    Precondition : ऑब्जेक्ट एक मान्य सूचक है जिसमें या तो कोई रिक्त सूचक है या __ कमजोर ऑब्जेक्ट के रूप में पंजीकृत किया गया है।

    अगर ऑब्जेक्ट एक __ कमजोर ऑब्जेक्ट के रूप में पंजीकृत है, और ऑब्जेक्ट में संग्रहीत अंतिम मान को अभी तक वितरित नहीं किया गया है या डीअलोकेशन शुरू नहीं किया गया है, रखता है और ऑटोरेलियल्स जो मूल्य और रिटर्न देता है । अन्यथा नल रिटर्न निम्न कोड के समतुल्य:

      id objc_loadWeak (id * ऑब्जेक्ट) {return objc_autorelease (objc_loadWeakRetained (ऑब्जेक्ट));  ऑब्जेक्ट  पर  objc_storeWeak  के कॉल के संबंध में परमाणु होना आवश्यक है।  

    तर्क < / Strong>

    कमजोर संदर्भ लोड हो रहा है, स्वाभाविक रूप से दौड़ की स्थिति को बनाए रखने के बिना प्रवण होता है।

    चूंकि objc_loadWaak को एक ऑटोरियोज पूल की आवश्यकता है, तो आपके पास एक आटोरीवेज़ पूल मौजूद होना चाहिए __वेक का प्रयोग करते समय पूल एनएसएयूटेरिएरेपिपल या @ऑटोरेयलेपुल द्वारा या तो बनाया जा सकता है। अगर कोई ऑटोरेक्लेज पूल मौजूद नहीं है, तो objc_loadWaak के बाद कुछ भी आपके ऑब्जेक्ट को रिलीज़ नहीं करेगा और आपके ऑब्जेक्ट को कभी भी डीअलोकेटेड नहीं किया जाएगा।

    यहां पर कोड के लिए एक फिक्स है:

      #import & lt; फाउंडेशन / फाउंडेशन। एच & gt; @ इंटफेस मायऑब्ज़: एनएसओबैजेट @ एक्सपोर्ट @ माइॉल - (रिक्त) डेलोक {एनएसएलॉग (@ "माइऑज़ डेलोकैड% पी", स्वयं); } @ अंत इंट मुख्य (इंट आर्गिक, कॉन्स्ट चार् * आर्विवि []) {@autoreleasepool {MyObj * obj1 = [[मायऑब आलोक] इनिट]; __weak MyObj * weakObj1 = obj1; एनएसएलॉग (@ "इसे प्रयोग करें:% पी \ n", कमजोर ओबेज 1); // अब MyObj को deallocated है) वापसी 0; }    

No comments:

Post a Comment