2012-01-14 6 views
12

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

मैं थोड़ा जटिल लड़का हूं, इसलिए मुझे उपयोग करने के लिए सुविधा को स्वीकार करने के लिए अंतर्निहित कार्यान्वयन प्रिंसिपल को जानने की आवश्यकता है। लेकिन समस्या यह है कि दस्तावेज ढूंढना बहुत मुश्किल है जो शून्य-कमजोर पॉइंटर के प्रिंसिपल का वर्णन करता है :(

आईएमओ, यह काम करने का एकमात्र तरीका सभी पॉइंटर्स को रनटाइम पर संदर्भित करना और उन्हें रखने के लिए सभी nil सेट करना है जब इसकी संदर्भित गिनती 0 हो जाता है। लेकिन इस बहुत भारी और बेवकूफ लग रहा है। मेरा मानना ​​है कि एक बहुत बेहतर समाधान वास्तविक एआरसी कार्यान्वयन में इस्तेमाल किया।

तुम मुझे दस्तावेज़ प्राप्त करने के? या प्रत्यक्ष वर्णन अधिक अच्छा होगा मदद कर सकते हैं!

उत्तर

17

यह समझाया गया है:

http://mikeash.com/pyblog/friday-qa-2010-07-16-zeroing-weak-references-in-objective-c.html

बिगाड़ने:

यह बहुत ज्यादा है आप कैसे लगता है कि काम करता है। प्रत्येक वर्ग कमजोर पॉइंटर्स के पते का एक सेट रखता है जो इसे इंगित कर रहे हैं, और जब इसके डेलोक को बुलाया जाता है तो यह उन्हें शून्य पर सेट करता है।

यह गूंगा प्रतीत हो सकता है, लेकिन यह तेज़ है क्योंकि इसमें कोई "ट्रैकिंग" शामिल नहीं है, एआरसी प्रत्येक ऑब्जेक्ट को एक नए कमजोर संदर्भ के लिए आवंटित किए जाने पर उस सेट पर पॉइंटर जोड़ने के लिए कोड डालता है।

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

+2

असल में, एआरसी के तहत, कंपाइलर 'objc_storeWeak' और 'objc_loadWeakRetain' जैसे कार्यों को कॉल करने के लिए कोड उत्सर्जित करता है। ये फ़ंक्शंस एक प्रलेखित एपीआई हैं: http://clang.llvm.org/docs/AutomaticReferenceCounting.html#runtime –

+0

हां, और वे फ़ंक्शंस यह है कि ऑब्जेक्ट में संग्रहीत सेट से कमजोर पॉइंटर्स को कैसे जोड़ता है और हटाता है, जैसा कि मैंने कहा जब मैंने कहा "एआरसी बस उस सेट में एक पॉइंटर जोड़ने के लिए कोड जोड़ता है जब ऑब्जेक्ट को एक नए कमजोर संदर्भ में सौंपा जाता है" –

+0

क्या आपको पता है कि कमजोर पॉइंटर उस समय शून्य हो गया है जब ऑब्जेक्ट ड्रॉप की संदर्भ गणना 0 तक, या जब इसे आवंटित किया जाता है? मैं अब एक "असाइन" पॉइंटर के साथ एक समस्या में भाग गया जहां संदर्भित ऑब्जेक्ट का पुन: उपयोग किया जाता है, लेकिन फिर भी इसके डेलोक को बुलाया जाता है, क्योंकि इसकी संदर्भ संख्या 0 के बीच घट जाती है। मैं सोच रहा था कि एक शून्य-कमजोर सूचक सूचक इसे हल करेगा या नहीं। – fishinear

संबंधित मुद्दे