2013-02-15 37 views
5

मेरे सवाल यह है कि फाउंडेशन के वर्तमान संस्करण NSObject ली गई वस्तुओं के लिए गिनती बनाए रखने को लागू (या ऑब्जेक्टिव-सी क्रम पुस्तकालय की है, क्योंकि यह वहाँ हो रहा है) क्या है? मैं NSObject.mm पर देख सकते हैं के रूप में, वहाँ कोई इवर NSObject के इंटरफ़ेस शरीर में retain count कहा जाता है। इसके बजाए, ऐसा लगता है कि प्रत्येक वस्तु के लिए संदर्भ काउंटर शामिल हैं। लेकिन अगर गिनती बनाए रखने वास्तव में एक नक्शे के साथ किया जाता है कार्यान्वयन (इस तरह से भी महंगा retain और release संचालन नहीं कर रहे हैं के बाद से, इस मामले में, यह आवश्यक लॉक करने के लिए और mutexes अनलॉक, नक्शे देखने सही वस्तु को खोजने के लिए, के अलावा है तथ्य यह है कि, एक बहुप्रचारित वातावरण में, एक ही समय में केवल एक वस्तु को बनाए रखा/जारी किया जा सकता है)?NSObject में कार्यान्वित गिनती कैसे बनाए रखी जाती है?

मैं जब एक नया वस्तु का आवंटन 1 के लिए काउंटर बनाए रखने की स्थापना, न NSObject.mm पर _objc_rootAllocWithZone है और न ही (जो समारोह है कि [NSObject alloc] द्वारा कहा जाता है हो रहा है) में से संबंधित कुछ भी नहीं मिला objc-runtime-new.mm पर _class_createInstanceFromZone (कि हो जाता है में बाद में _objc_rootAllocWithZone द्वारा बुलाया गया)।

+2

- (NSUInteger) retainCount {वापसी रैंड()}; – CodaFi

+0

ओह अच्छा भगवान, मैंने समाप्ति को गलत स्थान दिया है; ... मैं आज रात सो नहीं पाऊंगा। – CodaFi

उत्तर

10

NSObject के लिए गिनती बनाए रखने वास्तव में एक वैश्विक मानचित्र में रखा है। आईआईआरसी यह वास्तव में लॉक विवाद को कम करने के लिए, वस्तु के पते पर आधारित, नक्शे के एक समूह का उपयोग करता है, लेकिन वास्तविक कार्यान्वयन विवरण केवल कार्यान्वयन विवरण हैं।

किसी भी मामले में, आप कोड है कि 1 से गिनती बनाए रखने के सेट वजह से नहीं है वहाँ किसी भी नहीं मिल रहा। 1 की रखरखाव गिनती वाले ऑब्जेक्ट्स को मानचित्र में नहीं रखा जाता है। वस्तुओं सिर्फ प्रतिधारण गिनती नक्शा दर्ज करते हैं और retain अतीत प्रारंभिक 1. एड कर रहे हैं यह एक अनुकूलन है कि वस्तुओं के आम मामला है कि उनकी गिनती वृद्धि को बनाए रखने कभी नहीं गति है अतीत 1.

+1

... टैग किए गए पॉइंटर्स के विशेष मामले के साथ जिनके पास बरकरार गिनती नहीं है। डेटा को पॉइंटर के भीतर ही एन्कोड किया जाता है ताकि आप तकनीकी रूप से संदर्भ के बजाय उन्हें मूल्य के आधार पर पास कर सकें (क्योंकि संदर्भ मूल्य है और संदर्भ के पीछे कुछ भी वास्तविक नहीं है)। – Tommy

+0

सच है। और निश्चित रूप से 'वर्ग' और '-रलीज' को ओवरराइड करने वाली कोई भी कक्षा बरकरार गिनती के अपने कार्यान्वयन के लिए स्वतंत्र है। ऐसी कई कक्षाएं हैं जो बरकरार गिनती को इवर के रूप में एम्बेड करती हैं, क्योंकि वे बड़ी वस्तु रखने के खर्च पर 'बनाए रखने' और 'रिलीज' को तेज करना पसंद करते हैं। –

+0

ठीक है। लेकिन वे एक काउंटर के रूप में एक इवर का उपयोग क्यों नहीं करते हैं, जो बनाए रखने/जारी करने की लागत को कम करेगा? क्या आप जानते हैं कि नक्शे का उपयोग करने के लिए कोई विशेष कारण है या नहीं? – LuisABOL