ARC संकलक / रिलीज (कॉल) के साथ संकलित करने के लिए संकलक के साथ सिर्फ पुराने रिटेन / रिलीज (एमआरसी) खेलता है। यह एक जीसी प्रणाली की तुलना में उच्च प्रदर्शन, कम शिखर मेमोरी का उपयोग, और अधिक अनुमानित प्रदर्शन करने की प्रवृत्ति रखेगा।
दूसरी ओर एआरसी (या एमआरसी) के साथ कुछ प्रकार की डेटा संरचना संभव नहीं है, जबकि जीसी उन्हें संभाल सकते हैं।
एक उदाहरण के रूप में, यदि आपके पास नोड नाम का एक वर्ग है, और नोड में बच्चों का एक NSArray है, और अपने माता-पिता के लिए एक एकल संदर्भ है जो GC के साथ "बस काम करता है"। एआरसी (और मैनुअल रेफरेंस काउंटिंग के साथ) आपको एक समस्या है। किसी भी दिए गए नोड को उसके बच्चों से और उसके माता-पिता से भी संदर्भित किया जाएगा।
पसंद:
A -> [B1, B2, B3]
B1 -> A, B2 -> A, B3 -> A
ए का उपयोग करते समय सब ठीक है (स्थानीय चर के माध्यम से कहें)।
जब आप इसे (और बी 1 / बी 2 / बी 3) के साथ किया जाता है, तो एक जीसी प्रणाली अंततः सब कुछ को देखने का फैसला करेगी जो स्टैक और सीपीयू रजिस्टरों से शुरू हो सकती है। यह ए, बी 1, बी 2, बी 3 कभी नहीं मिलेगा, इसलिए यह उन्हें अंतिम रूप देगा और अन्य वस्तुओं में मेमोरी को रीसायकल करेगा।
जब आप एआरसी या एमआरसी का उपयोग करते हैं, और ए के साथ खत्म होता है, तो इसमें 3 (बी 1, बी 2, और बी 3 का एक संदर्भ होता है), और बी 1 / बी 2 / बी 3 में सभी संदर्भ संख्या 1 (ए का एनएसएरे) एक संदर्भ रखती है। से प्रत्येक)। इसलिए वे सभी वस्तुएं जीवित रहती हैं, हालांकि कुछ भी कभी भी उनका उपयोग नहीं कर सकता है।
आम समाधान यह है कि उन संदर्भों में से एक को कमजोर करने की आवश्यकता है (संदर्भ गणना में योगदान नहीं)। यह कुछ उपयोग पैटर्न के लिए काम करेगा, उदाहरण के लिए यदि आप B1 / B2 / B3 को केवल A के माध्यम से संदर्भित करते हैं, हालांकि अन्य पैटर्न में यह विफल रहता है। उदाहरण के लिए यदि आप कभी-कभी बी 1 पर पकड़ लेंगे, और माता-पिता सूचक के माध्यम से वापस ऊपर चढ़ने की उम्मीद करेंगे और ए को पाएंगे कमजोर संदर्भ के साथ यदि आप केवल बी 1 पर पकड़ते हैं, तो ए (और सामान्य रूप से) वाष्पित हो जाएगा, और बी 2 और बी 3 ले सकते हैं। इसके साथ।
कभी-कभी यह कोई समस्या नहीं है, लेकिन डेटा की जटिल संरचनाओं के साथ काम करने के कुछ बहुत ही उपयोगी और प्राकृतिक तरीके एआरसी / एमआरसी के साथ उपयोग करना बहुत मुश्किल है।
तो ARC एक ही तरह की समस्याओं GC लक्ष्य को लक्षित करता है। हालाँकि ARC उपयोग पैटर्न के अधिक सीमित सेट पर काम करता है, तो GC, इसलिए यदि आपने GC भाषा (जैसे जावा) ली और इस पर ARC की तरह कुछ तैयार किया, तो कुछ प्रोग्राम और अधिक काम नहीं करेंगे (या कम से कम परित्यक्त मेमोरी के टन उत्पन्न करेंगे) , और गंभीर गमागमन मुद्दों का कारण हो सकता है या स्मृति या स्वैप स्थान से बाहर हो सकता है)।
आप यह भी कह सकते हैं कि ARC प्रदर्शन पर एक बड़ी प्राथमिकता देता है (या शायद पूर्वानुमेयता) जबकि GC एक सामान्य समाधान होने पर एक बड़ी प्राथमिकता रखता है। नतीजतन जीसी में एआरसी की तुलना में कम अनुमानित सीपीयू / मेमोरी की मांग और कम प्रदर्शन (सामान्य रूप से) है, लेकिन किसी भी उपयोग पैटर्न को संभाल सकता है। एआरसी कई सामान्य उपयोग पैटर्न के लिए बहुत बेहतर काम करेगा, लेकिन कुछ (वैध!) उपयोग पैटर्न के लिए यह गिर जाएगा और मर जाएगा।