प्राथमिक स्मृति-संबंधित समस्या आपको अभी भी जागरूक होने की आवश्यकता होगी चक्रों को बनाए रखना है। ऐसा तब होता है जब एक ऑब्जेक्ट में दूसरे के लिए एक मजबूत सूचक होता है, लेकिन लक्ष्य ऑब्जेक्ट में मूल पॉइंटर मूल पर वापस आ जाता है। यहां तक कि जब इन वस्तुओं के सभी अन्य संदर्भ हटा दिए जाते हैं, तब भी वे एक दूसरे के पास रहेंगे और जारी नहीं किए जाएंगे। यह अप्रत्यक्ष रूप से, ऑब्जेक्ट्स की एक श्रृंखला द्वारा भी हो सकता है, जिसमें श्रृंखला में आखिरी वस्तु हो सकती है जो पहले की वस्तु को संदर्भित करती है।
इस कारण से __unsafe_unretained
और __weak
स्वामित्व क्वालीफायर मौजूद हैं। पूर्व किसी भी वस्तु को इंगित नहीं करेगा, लेकिन उस वस्तु को दूर करने की संभावना खुलती है और यह खराब स्मृति को इंगित करती है, जबकि उत्तरार्द्ध वस्तु को बरकरार नहीं रखता है और जब उसका लक्ष्य हटा दिया जाता है तो स्वचालित रूप से खुद को शून्य पर सेट करता है। दो में से, __weak
आम तौर पर प्लेटफॉर्म पर पसंद करते हैं जो इसका समर्थन करते हैं।
आप प्रतिनिधियों जैसे चीजों के लिए इन क्वालीफायरों का उपयोग करेंगे, जहां आप नहीं चाहते हैं कि ऑब्जेक्ट अपने प्रतिनिधि को बनाए रखे और संभावित रूप से एक चक्र का नेतृत्व कर सके।
महत्वपूर्ण स्मृति-संबंधित चिंताओं का एक और जोड़ा कोर फाउंडेशन ऑब्जेक्ट्स और malloc()
का उपयोग करके आवंटित स्मृति char*
जैसे प्रकारों के लिए आवंटित किया गया है। एआरसी इन प्रकारों का प्रबंधन नहीं करता है, केवल उद्देश्य-सी ऑब्जेक्ट्स, इसलिए आपको अभी भी स्वयं से निपटने की आवश्यकता होगी। कोर फाउंडेशन प्रकार विशेष रूप से मुश्किल हो सकते हैं, क्योंकि कभी-कभी उन्हें ऑब्जेक्टिव-सी ऑब्जेक्ट्स के मिलान के लिए ब्रिज किया जाना चाहिए, और इसके विपरीत। इसका मतलब यह है कि सीएफ प्रकारों और उद्देश्य-सी के बीच ब्रिजिंग करते समय नियंत्रण को एआरसी से आगे और आगे स्थानांतरित करने की आवश्यकता होती है। इस ब्रिजिंग से संबंधित कुछ कीवर्ड जोड़े गए हैं, और his lengthy ARC writeup में माइक एश के विभिन्न ब्रिजिंग मामलों का एक बड़ा विवरण है।
इसके अतिरिक्त, कई अन्य कम बार-बार होते हैं, लेकिन अभी भी संभावित समस्याग्रस्त मामले हैं, जो published specification विस्तार से आगे बढ़ते हैं।
अधिकांश नए व्यवहार, जब तक उनके पास एक मजबूत सूचक होता है, तब तक वस्तुओं को रखने के आधार पर, मैक पर कचरा संग्रह के समान ही होता है। हालांकि, तकनीकी आधार बहुत अलग हैं। ऑब्जेक्ट्स को साफ करने के लिए नियमित अंतराल पर चलने वाली कचरा कलेक्टर प्रक्रिया होने की बजाय, अब स्मृति की इस शैली को कठोर बनाए रखने/रिलीज नियमों पर निर्भर करता है, जिसे हमें उद्देश्य-सी में पालन करने की आवश्यकता होती है।
एआरसी बस दोहराए जाने वाले स्मृति प्रबंधन कार्यों को लेता है जो हमें वर्षों से करना पड़ता है और उन्हें कंपाइलर को ऑफ़लोड करता है, इसलिए हमें उन्हें फिर से चिंता करने की ज़रूरत नहीं है। इस तरह, आपके पास कचरा एकत्रित प्लेटफॉर्म पर अनुभवी समस्याएं या शर्टूथ मेमोरी प्रोफाइल नहीं हैं। मैंने इन दोनों कचरे में मैक अनुप्रयोगों को एकत्रित किया है, और यह देखने के लिए उत्सुक हूं कि वे एआरसी के तहत कैसे व्यवहार करते हैं।
कचरा संग्रह बनाम एआरसी पर अधिक के लिए, this very interesting response by Chris Lattner on the Objective-C mailing list देखें, जहां वह उद्देश्य-सी 2.0 कचरा संग्रह पर एआरसी के कई फायदे सूचीबद्ध करता है। मैंने जीसी मुद्दों में से कई में भाग लिया है।
विस्तार जवाब के लिए धन्यवाद। मेरे पास एक ही समस्या थी जहां मैंने _unsafe_unretained के तहत एक प्रतिनिधि को परिभाषित किया और मेरा आवेदन क्रैश हो गया, बाद में इसे मजबूत करके बदल दिया गया लेकिन अब इसमें स्मृति रिसाव है। तो, मैंने इसे कमजोर कर दिया और एक आकर्षण की तरह काम करता है। – chathuram
@ichathura वाह! आपने मुझे एआरसी मूर से बचाया। CMPopTipView का उपयोग करते समय मुझे एक ही दुर्घटना का सामना करना पड़ा। – Nianliang
@ ब्रैडलर्सन: "आपके पास कचरा इकट्ठा करने वाले प्लेटफॉर्म पर अनुभवी समस्याएं या शर्टूथ मेमोरी प्रोफाइल नहीं हैं"। मैं स्कोप-आधारित पुनर्विचार और संदर्भ गणना से बहुत खराब प्रदर्शन से खराब रोकथाम और सॉटूओथ मेमोरी प्रोफाइल की अपेक्षा करता हूं, इसलिए मैं एक वास्तविक तुलना देखना चाहता हूं। –