ios - उद्देश्य-सी में स्वचालित संदर्भ गिनती किस तरह की रिसाव को रोकती है या कम नहीं करती है?




objective-c macos (4)

एआरसी कोरफाउंडेशन प्रकारों का प्रबंधन भी नहीं करेगा। आप उन्हें 'पुल' कर सकते हैं ( CFBridgingRelease() का उपयोग करके) लेकिन केवल अगर आप इसे उद्देश्य-सी / कोको ऑब्जेक्ट के रूप में उपयोग करने जा रहे हैं। ध्यान दें कि CFBridgingRelease केवल कोरफॉउंडेशन को 1 से गिनती बनाए रखता है और इसे ऑब्जेक्टिव-सी के एआरसी में ले जाता है।

मैक और आईओएस प्लेटफार्मों में, स्मृति रिसाव अक्सर अप्रकाशित पॉइंटर्स के कारण होते हैं। परंपरागत रूप से, यह सुनिश्चित करने के लिए कि आपके पास एक संबंधित रिलीज संदेश है, अपने आवंटन, प्रतियों और बनाए रखने के लिए हमेशा अत्यंत महत्वपूर्ण रहा है।

एक्सकोड 4.2 के साथ आने वाला टूलचेन एलएलवीएम कंपाइलर के नवीनतम संस्करण के साथ स्वचालित संदर्भ गिनती (एआरसी) प्रस्तुत करता है, जो संकलक को स्मृति के लिए आपके सामान को प्रबंधित करने के द्वारा पूरी तरह से इस समस्या से दूर हो जाता है। यह बहुत अच्छा है, और यह बहुत सारे अनावश्यक, सांसारिक विकास के समय में कटौती करता है और बहुत सी लापरवाही मेमोरी लीक को रोकता है जो उचित बनाए रखने / रिलीज संतुलन के साथ ठीक करना आसान होता है। यहां तक ​​कि जब आप अपने मैक और आईओएस ऐप्स के लिए एआरसी सक्षम करते हैं तो ऑटोरेलीज पूल को अलग-अलग प्रबंधित करने की आवश्यकता होती है (क्योंकि आपको अब अपना स्वयं का NSAutoreleasePool एस आवंटित नहीं करना चाहिए)।

लेकिन क्या अन्य स्मृति रिसाव यह रोकता है कि मुझे अभी भी देखना है?

बोनस के रूप में, मैक ओएस एक्स और आईओएस पर एआरसी और मैक ओएस एक्स पर कचरा संग्रह के बीच अंतर क्या हैं?


एआरसी गैर-ओबीजेसी मेमोरी के साथ आपकी मदद नहीं करेगा, उदाहरण के लिए यदि आप कुछ malloc() हैं, तो आपको अभी भी इसे free() करने की आवश्यकता है।

एआरसी performSelector: द्वारा बेवकूफ बनाया जा सकता है चयनकर्ता performSelector: यदि संकलक यह नहीं समझ सकता कि चयनकर्ता क्या है (संकलक उस पर चेतावनी उत्पन्न करेगा)।

एआरसी ओबीजेसी नामकरण सम्मेलनों के बाद भी कोड उत्पन्न करेगा, इसलिए यदि आप एआरसी और एमआरसी कोड को मिश्रित करते हैं तो आप आश्चर्यजनक परिणाम प्राप्त कर सकते हैं यदि एमआरसी कोड ऐसा नहीं करता है जो संकलक नामों के वादे को सोचता है।


निम्नलिखित 4 मुद्दों के कारण मैंने अपने आवेदन में मेमोरी लीक का अनुभव किया:

  1. दृश्य नियंत्रकों को खारिज करते समय NSTimers को अमान्य नहीं कर रहा है
  2. व्यू कंट्रोलर को खारिज करते समय NSNotificationCenter को किसी भी पर्यवेक्षक को हटाने के लिए भूलना।
  3. ब्लॉक में स्वयं के लिए मजबूत संदर्भ रखते हुए।
  4. दृश्य नियंत्रक गुणों में प्रतिनिधियों के लिए मजबूत संदर्भ का उपयोग करना

सौभाग्य से मैं निम्नलिखित ब्लॉग पोस्ट में आया और उन्हें सही करने में सक्षम था: http://www.reigndesign.com/blog/debugging-retain-cycles-in-objective-c-four-likely-culprits/


प्राथमिक स्मृति-संबंधी समस्या जिसे आपको अभी भी जागरूक होने की आवश्यकता होगी, वह चक्र बनाए रखेगा। ऐसा तब होता है जब एक ऑब्जेक्ट में दूसरे के लिए एक मजबूत सूचक होता है, लेकिन लक्ष्य ऑब्जेक्ट में मूल पॉइंटर मूल पर वापस आ जाता है। यहां तक ​​कि जब इन वस्तुओं के सभी अन्य संदर्भ हटा दिए जाते हैं, तब भी वे एक दूसरे के पास रहेंगे और जारी नहीं किए जाएंगे। यह अप्रत्यक्ष रूप से, ऑब्जेक्ट्स की एक श्रृंखला द्वारा भी हो सकता है, जिसमें श्रृंखला में आखिरी वस्तु हो सकती है जो पहले की वस्तु को संदर्भित करती है।

यही कारण है कि __unsafe_unretained और __weak स्वामित्व क्वालीफायर मौजूद हैं। पूर्व किसी भी वस्तु को इंगित नहीं करेगा, लेकिन उस वस्तु को दूर करने की संभावना खुलती है और यह खराब स्मृति को इंगित करती है, जबकि उत्तरार्द्ध वस्तु को बरकरार नहीं रखता है और जब उसका लक्ष्य हटा दिया जाता है तो स्वचालित रूप से खुद को शून्य पर सेट करता है। दोनों में से, __weak आमतौर पर प्लेटफॉर्म पर पसंद किया जाता है जो इसका समर्थन करता है।

आप प्रतिनिधियों जैसे चीजों के लिए इन क्वालीफायरों का उपयोग करेंगे, जहां आप नहीं चाहते हैं कि ऑब्जेक्ट अपने प्रतिनिधि को बनाए रखे और संभावित रूप से एक चक्र का नेतृत्व कर सके।

महत्वपूर्ण स्मृति-संबंधी चिंताओं का एक और जोड़ा कोर फाउंडेशन ऑब्जेक्ट्स और malloc() जैसे char* जैसे प्रकारों के लिए आवंटित स्मृति का संचालन है। एआरसी इन प्रकारों का प्रबंधन नहीं करता है, केवल उद्देश्य-सी ऑब्जेक्ट्स, इसलिए आपको अभी भी स्वयं से निपटने की आवश्यकता होगी। कोर फाउंडेशन प्रकार विशेष रूप से मुश्किल हो सकते हैं, क्योंकि कभी-कभी उन्हें ऑब्जेक्टिव-सी ऑब्जेक्ट्स के मिलान के लिए ब्रिज किया जाना चाहिए, और इसके विपरीत। इसका मतलब यह है कि सीएफ प्रकारों और उद्देश्य-सी के बीच ब्रिजिंग करते समय नियंत्रण को एआरसी से आगे और आगे स्थानांतरित करने की आवश्यकता होती है। इस ब्रिजिंग से संबंधित कुछ कीवर्ड जोड़े गए हैं, और माइक एश के पास उनके लंबे एआरसी लेखन में विभिन्न ब्रिजिंग मामलों का एक बड़ा विवरण है।

इसके अलावा, कई अन्य कम बार-बार, लेकिन अभी भी संभावित समस्याग्रस्त मामले हैं, जो प्रकाशित विनिर्देश विस्तार से आगे बढ़ते हैं।

जब तक उनके पास एक मजबूत सूचक होता है, तब तक ऑब्जेक्ट्स को रखने के आधार पर नए व्यवहार का अधिकांश हिस्सा मैक पर कचरा संग्रह के समान होता है। हालांकि, तकनीकी आधार बहुत अलग हैं। ऑब्जेक्ट्स को साफ करने के लिए नियमित अंतराल पर चलने वाली कचरा कलेक्टर प्रक्रिया होने की बजाय, अब स्मृति की इस शैली को कठोर बनाए रखने / रिलीज नियमों पर निर्भर करता है, जिसे हमें उद्देश्य-सी में पालन करने की आवश्यकता होती है।

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

कचरा संग्रह बनाम एआरसी पर अधिक के लिए, उद्देश्य-सी मेलिंग सूची पर क्रिस लैटनर द्वारा यह बहुत ही रोचक प्रतिक्रिया देखें, जहां उन्होंने उद्देश्य-सी 2.0 कचरा संग्रह पर एआरसी के कई फायदे सूचीबद्ध किए हैं। मैंने जीसी मुद्दों में से कई में भाग लिया है।





automatic-ref-counting