प्राथमिक मेमोरी-संबंधी समस्या जिसे आपको अभी भी पता होना चाहिए, वह है चक्र को बनाए रखना। यह तब होता है जब एक वस्तु में दूसरे के लिए एक मजबूत सूचक होता है, लेकिन लक्ष्य वस्तु के मूल में एक मजबूत सूचक होता है। यहां तक कि जब इन वस्तुओं के अन्य सभी संदर्भ हटा दिए जाते हैं, तब भी वे एक-दूसरे को पकड़ेंगे और जारी नहीं किए जाएंगे। यह अप्रत्यक्ष रूप से भी हो सकता है, वस्तुओं की एक श्रृंखला के द्वारा जो श्रृंखला में अंतिम एक हो सकती है जो पहले वाली वस्तु पर वापस आती है।
यह इस कारण से है कि __unsafe_unretained
और __weak
स्वामित्व वाले क्वालिफायर मौजूद हैं। पूर्व किसी भी वस्तु को इंगित नहीं करेगा जिसे वह इंगित करता है, लेकिन उस वस्तु के दूर जाने की संभावना को छोड़ देता है और यह खराब स्मृति की ओर इशारा करता है, जबकि बाद वाला वस्तु को बनाए नहीं रखता है और अपने लक्ष्य के समाप्त होने पर स्वतः ही शून्य पर सेट हो जाता है। दो में से, __weak
आमतौर पर उन प्लेटफार्मों पर पसंद किया जाता है जो इसका समर्थन करते हैं।
आप डेलिगेट जैसी चीजों के लिए इन क्वालीफायर का उपयोग करेंगे, जहाँ आप नहीं चाहते कि ऑब्जेक्ट उसके डेलिगेट को बनाए रखे और संभावित रूप से एक चक्र तक ले जाए।
मेमोरी से संबंधित महत्वपूर्ण चिंताओं के एक और malloc()
प्रकार के उपयोग से आवंटित कोर फाउंडेशन ऑब्जेक्ट्स और मेमोरी को संभालना है char*
। एआरसी इन प्रकारों का प्रबंधन नहीं करता है, केवल ऑब्जेक्टिव-सी ऑब्जेक्ट्स, इसलिए आपको अभी भी उनसे खुद निपटने की आवश्यकता होगी। कोर फाउंडेशन के प्रकार विशेष रूप से मुश्किल हो सकते हैं, क्योंकि कभी-कभी उन्हें ऑब्जेक्ट-सी ऑब्जेक्ट्स से मेल खाने के लिए पार करने की आवश्यकता होती है, और इसके विपरीत। इसका मतलब यह है कि CF प्रकार और उद्देश्य-सी के बीच ब्रिजिंग करते समय ARC से नियंत्रण को आगे और पीछे स्थानांतरित किया जाना चाहिए। इस ब्रिडिंग से संबंधित कुछ कीवर्ड जोड़े गए हैं, और माइक ऐश ने अपने सबसे लंबे पोस्टकार्ड में विभिन्न ब्रिजिंग मामलों का शानदार वर्णन किया है ।
इसके अलावा, कई अन्य कम लगातार होते हैं, लेकिन अभी भी संभावित रूप से समस्याग्रस्त मामले हैं, जो प्रकाशित विनिर्देश विस्तार से जाते हैं।
बहुत से नए व्यवहार, वस्तुओं को तब तक रखने के आधार पर जब तक कि उनके लिए एक मजबूत सूचक नहीं होता है, मैक पर कचरा संग्रह के समान है। हालाँकि, तकनीकी कमियां बहुत अलग हैं। कचरा उठाने की प्रक्रिया होने के बजाय, जो नियमित अंतराल पर चलती है ताकि वस्तुओं को साफ न किया जा सके, स्मृति प्रबंधन की यह शैली कठोर अनुरक्षण / रिलीज नियमों पर निर्भर करती है, जिन्हें हम सभी को उद्देश्य-सी में पालन करने की आवश्यकता है।
एआरसी केवल दोहराए जाने वाले स्मृति प्रबंधन कार्यों को लेता है जो हमें वर्षों से करना था और उन्हें संकलक के लिए रवाना करना है ताकि हमें फिर से उनके बारे में चिंता न करनी पड़े। इस तरह, आपके पास कूड़े की समस्याएँ नहीं हैं या कचरा एकत्र किए गए प्लेटफ़ॉर्म पर अनुभवी मेमोरी प्रोफाइल हैं। मैंने इन दोनों को अपने कचरा एकत्र मैक अनुप्रयोगों में अनुभव किया है, और यह देखने के लिए उत्सुक हूं कि वे एआरसी के तहत कैसे व्यवहार करते हैं।
कचरा संग्रह बनाम एआरसी के बारे में अधिक जानने के लिए, ऑब्जेक्टिव-सी मेलिंग सूची में क्रिस लैटनर द्वारा यह बहुत ही दिलचस्प प्रतिक्रिया देखें , जहां वह उद्देश्य-सी 2.0 कचरा संग्रह पर एआरसी के कई फायदे सूचीबद्ध करता है। मैंने कई GC मुद्दों में उनका वर्णन किया है।