हां और ना। यदि आप NSAutoreleasePool ऑब्जेक्ट को मेमोरी में "लीक" करते हैं, तो रिलीज के बजाय नाली का उपयोग करके मेमोरी में डाल देंगे यदि आप इसे एकत्र किए गए कचरे (मेमोरी प्रबंधित नहीं) पर्यावरण के तहत चलाते हैं। यह "रिसाव" बस NSAutoreleasePool का उदाहरण देता है "पहुंच योग्य" जीसी के तहत कोई मजबूत पॉइंटर्स के साथ किसी भी अन्य ऑब्जेक्ट की तरह, और अगली बार GC रन होने पर ऑब्जेक्ट को साफ किया जाएगा, जो कॉल के बाद बहुत अच्छी तरह से हो सकता है -drain
:
नाली
कचरा एकत्र किए गए वातावरण में, कचरा संग्रहण को ट्रिगर करता है यदि पिछले संग्रह के बाद से आवंटित मेमोरी वर्तमान सीमा से अधिक है; अन्यथा रिहाई के रूप में व्यवहार करता है। ... कचरा-एकत्र किए गए वातावरण में, यह विधि अंततः कॉल करती है objc_collect_if_needed
।
अन्यथा, यह -release
गैर-जीसी के तहत व्यवहार करने के समान है , हां। जैसा कि अन्य ने कहा है, -release
जीसी के तहत एक नो-ऑप है, इसलिए यह सुनिश्चित करने का एकमात्र तरीका है कि जीसी के तहत पूल फ़ंक्शन ठीक से हो -drain
, और -drain
गैर-जीसी के -release
तहत बिल्कुल गैर-जीसी के तहत काम करता है , और यकीनन इसकी कार्यक्षमता को अधिक स्पष्ट रूप से बताता है। कुंआ।
मुझे यह बताना चाहिए कि आपके कथन "नए, आवंटित या init के साथ कुछ भी कहा जाता है" में "init" शामिल नहीं होना चाहिए (लेकिन "प्रतिलिपि" शामिल होना चाहिए), क्योंकि "init" स्मृति आवंटित नहीं करता है, यह केवल ऑब्जेक्ट (निर्माता) सेट करता है फैशन)। यदि आपको एक आबंटित वस्तु प्राप्त होती है और आपका कार्य केवल init कहलाता है, तो आप इसे जारी नहीं करेंगे:
- (void)func:(NSObject*)allocd_but_not_init
{
[allocd_but_not_init init];
}
यह आपके द्वारा पहले से शुरू की गई तुलना में किसी भी अधिक मेमोरी का उपभोग नहीं करता है (यह मानते हुए init ऑब्जेक्ट्स को तुरंत नहीं करता है, लेकिन आप वैसे भी उन लोगों के लिए जिम्मेदार नहीं हैं)।