objective c - नया स्वचालित संदर्भ गिनती तंत्र कैसे काम करता है?




objective-c cocoa-touch (4)

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

दूसरी ओर एआरसी (या एमआरसी) के साथ कुछ प्रकार की डेटा संरचना संभव नहीं है, जबकि जीसी उन्हें संभाल सकता है।

उदाहरण के तौर पर, यदि आपके पास नोड नामक एक वर्ग है, और नोड में बच्चों का एनएसएआरआरई है, और इसके माता-पिता के लिए एक संदर्भ है कि जीसी के साथ "बस काम करता है"। एआरसी (और मैन्युअल संदर्भ गिनती के साथ) आपको एक समस्या है। किसी भी दिए गए नोड को अपने बच्चों और उसके माता-पिता से भी संदर्भित किया जाएगा।

पसंद:

A -> [B1, B2, B3]
B1 -> A, B2 -> A, B3 -> A

जब आप ए का उपयोग कर रहे हों तो सभी ठीक हैं (स्थानीय चर के माध्यम से कहें)।

जब आप इसके साथ (और बी 1 / बी 2 / बी 3) करते हैं, तो अंततः एक जीसी सिस्टम स्टैक और सीपीयू रजिस्टरों से शुरू होने वाली हर चीज को देखने का फैसला करेगा। इसे ए, बी 1, बी 2, बी 3 कभी नहीं मिलेगा, इसलिए यह उन्हें अंतिम रूप देगा और स्मृति को अन्य वस्तुओं में रीसायकल करेगा।

जब आप एआरसी या एमआरसी का उपयोग करते हैं, और ए के साथ खत्म होता है तो इसमें 3 (बी 1, बी 2, और बी 3 का संदर्भ होता है), और बी 1 / बी 2 / बी 3 में सभी की संदर्भ गणना होगी (ए के एनएसएआरएआरई के संदर्भ में एक संदर्भ है से प्रत्येक)। तो उन सभी वस्तुओं को जीवित रहते हैं, भले ही कुछ भी कभी उनका उपयोग नहीं कर सके।

आम समाधान यह तय करना है कि उन संदर्भों में से एक को कमजोर होना चाहिए (संदर्भ गणना में योगदान नहीं)। यह कुछ उपयोग पैटर्न के लिए काम करेगा, उदाहरण के लिए यदि आप केवल ए के माध्यम से बी 1 / बी 2 / बी 3 का संदर्भ देते हैं, हालांकि अन्य पैटर्न में यह विफल रहता है। उदाहरण के लिए यदि आप कभी-कभी बी 1 पर पकड़ लेंगे, और पैरेंट पॉइंटर के माध्यम से बैक अप चढ़ने की उम्मीद करेंगे और ए को ढूंढें। कमजोर संदर्भ के साथ यदि आप केवल बी 1 पर हैं, ए (और सामान्य रूप से) वाष्पीकरण कर सकता है, और बी 2 और बी 3 ले सकता है इसके साथ।

कभी-कभी यह कोई मुद्दा नहीं है, लेकिन डेटा की जटिल संरचनाओं के साथ काम करने के कुछ बहुत ही उपयोगी और प्राकृतिक तरीके एआरसी / एमआरसी के साथ उपयोग करना बहुत मुश्किल है।

इसलिए एआरसी जीसी लक्ष्यों की एक ही तरह की समस्याओं को लक्षित करता है। हालांकि एआरसी जीसी के उपयोग के पैटर्न के अधिक सीमित सेट पर काम करता है, इसलिए यदि आपने जीसी भाषा (जावा की तरह) ली है और उस पर एआरसी की तरह कुछ तैयार किया है तो कुछ प्रोग्राम अब और काम नहीं करेंगे (या कम से कम छोड़े गए मेमोरी उत्पन्न करेंगे , और गंभीर स्वैपिंग समस्याएं उत्पन्न कर सकता है या स्मृति या स्वैप स्पेस से बाहर हो सकता है)।

आप यह भी कह सकते हैं कि एआरसी प्रदर्शन (या शायद भविष्यवाणी) पर एक बड़ी प्राथमिकता रखता है जबकि जीसी एक सामान्य समाधान होने पर एक बड़ी प्राथमिकता रखता है। नतीजतन जीसी में कम अनुमानित सीपीयू / मेमोरी मांग है, और एआरसी की तुलना में कम प्रदर्शन (सामान्य रूप से) है, लेकिन किसी भी उपयोग पैटर्न को संभाल सकता है। एआरसी कई आम उपयोग पैटर्न के लिए बहुत बेहतर काम करेगा, लेकिन कुछ (वैध!) उपयोग पैटर्न के लिए यह गिर जाएगा और मर जाएगा।

क्या कोई मुझे संक्षेप में समझा सकता है कि एआरसी कैसे काम करता है? मुझे पता है कि यह कचरा संग्रह से अलग है, लेकिन मैं बस सोच रहा था कि यह कैसे काम करता है।

इसके अलावा, यदि एआरसी करता है कि जीसी प्रदर्शन में बाधा डाले बिना क्या करता है, तो जावा जीसी का उपयोग क्यों करता है? यह एआरसी का उपयोग क्यों नहीं करता है?


ऐप्पल डेवलपर दस्तावेज द्वारा बहुत अच्छी तरह से समझाया गया। पढ़ें "एआरसी कैसे काम करता है"

यह सुनिश्चित करने के लिए कि जब भी उनकी आवश्यकता हो, तो उदाहरण गायब नहीं हो जाते हैं, एआरसी ट्रैक करता है कि वर्तमान में प्रत्येक वर्ग के उदाहरण में कितने गुण, स्थिरांक और चर शामिल हैं। एआरसी एक उदाहरण को तब तक रद्द नहीं करेगा जब तक कि उस उदाहरण के कम से कम एक सक्रिय संदर्भ अभी भी मौजूद नहीं है।

यह सुनिश्चित करने के लिए कि जब भी उनकी आवश्यकता हो, तो उदाहरण गायब नहीं हो जाते हैं, एआरसी ट्रैक करता है कि वर्तमान में प्रत्येक वर्ग के उदाहरण में कितने गुण, स्थिरांक और चर शामिल हैं। एआरसी एक उदाहरण को तब तक रद्द नहीं करेगा जब तक कि उस उदाहरण के कम से कम एक सक्रिय संदर्भ अभी भी मौजूद नहीं है।

डिफ को जानना कचरा संग्रह और एआरसी के बीच: इसे पढ़ें


यह कचरा संग्रह से काफी भिन्न होता है। क्या आपने चेतावनियां देखी हैं जो आपको बताती हैं कि आप अलग-अलग लाइनों पर वस्तुओं को लीक कर सकते हैं? वे बयान आपको बताते हैं कि आपने किस वस्तु को आवंटित किया था। इसे एक कदम आगे ले जाया गया है और अब उचित स्थानों पर retain / release स्टेटमेंट्स को सम्मिलित कर सकते हैं, अधिकतर प्रोग्रामर से बेहतर, लगभग 100% समय। कभी-कभी बनाए रखने वाली वस्तुओं के कुछ अजीब उदाहरण होते हैं जिन्हें आपको इसकी सहायता करने की आवश्यकता होती है।


जादू

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

कुछ अन्य सुधारों में कमजोर संदर्भों को शून्य करना, ढेर में ब्लॉक की स्वचालित प्रतिलिपि, बोर्ड में गतिरोध (ऑटोरेलीज पूल के लिए 6x!) शामिल हैं।

एआरसी पर http://clang.llvm.org/docs/AutomaticReferenceCounting.html में यह सब कैसे काम करता है, इस बारे में अधिक विस्तृत चर्चा।





automatic-ref-counting