मैं जानना चाहूंगा कि आपने -retainCount
अब तक किस स्थिति का उपयोग किया है , और अंततः समस्याएं जो इसका उपयोग कर सकती हैं।
धन्यवाद।
मैं जानना चाहूंगा कि आपने -retainCount
अब तक किस स्थिति का उपयोग किया है , और अंततः समस्याएं जो इसका उपयोग कर सकती हैं।
धन्यवाद।
जवाबों:
आपको कभी भी उपयोग नहीं करना चाहिए -retainCount
, क्योंकि यह आपको कभी भी उपयोगी नहीं बताता है। फाउंडेशन और AppKit / UIKit फ्रेमवर्क का कार्यान्वयन अपारदर्शी है; आपको पता नहीं है कि क्या बनाए रखा जा रहा है, क्यों इसे बनाए रखा जा रहा है, कौन इसे बनाए रख रहा है, जब इसे बनाए रखा गया था, और इसी तरह।
उदाहरण के लिए:
[NSNumber numberWithInt:1]
होगा retainCount
। यह नहीं है। यह 2 है।@"Foo"
होगा retainCount
। यह नहीं है। यह 1152921504606846975 है।[NSString stringWithString:@"Foo"]
होगा retainCount
। यह नहीं है। दोबारा, यह 1152921504606846975 है।असल में, चूंकि कुछ भी एक वस्तु को बनाए रख सकता है (और इसलिए इसे बदल सकता है retainCount
), और चूंकि आपके पास किसी एप्लिकेशन को चलाने वाले अधिकांश कोड का स्रोत नहीं है, इसलिए एक ऑब्जेक्ट retainCount
अर्थहीन है।
यदि आप नीचे ट्रैक करने की कोशिश कर रहे हैं कि किसी वस्तु को क्यों नहीं हटाया जा रहा है, तो उपकरण में लीक्स टूल का उपयोग करें। यदि आप नीचे ट्रैक करने की कोशिश कर रहे हैं कि किसी वस्तु को बहुत जल्द क्यों डील किया गया था, तो इंस्ट्रूमेंट्स में लाश टूल का उपयोग करें।
लेकिन उपयोग नहीं करते -retainCount
। यह वास्तव में एक बेकार विधि है।
संपादित करें
कृपया सभी लोग http://bugreport.apple.com पर जाएँ और अनुरोध करें कि -retainCount
पदावनत किया जाए। जितने ज्यादा लोग इसके लिए कहेंगे, उतना अच्छा है।
# 2 संपादित करें
अद्यतन के रूप में, [NSNumber numberWithInt:1]
अब retainCount
922337203685474780807 में से एक है । यदि आपका कोड 2 होने की उम्मीद कर रहा था, तो आपका कोड अब टूट गया है।
- (NSUInteger)retainCount{return NSUIntegerMax;}
।
retainCount
।
गंभीरता से। बस यह मत करो।
बस मेमोरी मैनेजमेंट दिशानिर्देशों का पालन करें और केवल वही जारी करें जो आप alloc
, new
या copy
(या जो कुछ भी आप retain
मूल रूप से कहते हैं )।
@bbum ने SO पर यहाँ सबसे अच्छा कहा , और अपने ब्लॉग पर और भी अधिक विस्तार से ।
-retainCount
जा सकने वाली कोई भी जानकारी इंस्ट्रूमेंट्स और उसके टूल्स से प्राप्त की जा सकती है।
retain
, retain
, retain
, autorelease,
autorelease, autorelease
UIKit एपीआई के माध्यम से एक वस्तु गुजर, उदाहरण के लिए की एक पूरी तरह से वैध परिणाम हो सकता है।
ऑटोरेल्ड ऑब्जेक्ट्स एक ऐसा मामला है, जहाँ चेकिंग -retainCount एकरूप और संभावित भ्रामक है। रिटेन काउंट आपको इस बारे में कुछ नहीं बताता है कि किसी ऑब्जेक्ट पर कितनी बार -ऑटोरेलिज को बुलाया गया है और इसलिए वर्तमान ऑटोरेलिज पूल नालियों के चलते कितनी बार इसे छोड़ा जाएगा।
जब 'इंस्ट्रूमेंट्स' का उपयोग करके जाँच की जाती है, तो मुझे रिटेंक्शंस बहुत उपयोगी लगते हैं
'आवंटन' टूल का उपयोग करके, सुनिश्चित करें कि 'रिकॉर्ड संदर्भ मायने रखता है' चालू है और आप किसी भी ऑब्जेक्ट में जा सकते हैं और इसका रिटेनटाउन इतिहास देख सकते हैं।
Allocs और रिलीज़ को जोड़कर आप क्या हो रहा है की एक अच्छी तस्वीर प्राप्त कर सकते हैं और अक्सर उन मुश्किल मामलों को हल कर सकते हैं जहां कुछ जारी नहीं किया जा रहा है।
इसने मुझे कभी निराश नहीं किया - जिसमें iOS के शुरुआती बीटा रिलीज़ में बग ढूंढना भी शामिल है।
NSObject पर Apple प्रलेखन पर एक नज़र डालें, यह आपके प्रश्न को बहुत कवर करता है: NSObject रिटेनकाउंट
संक्षेप में, जब तक आप अपनी खुद की संदर्भ गणना प्रणाली लागू नहीं करते (और मैं लगभग गारंटी नहीं दे सकता) जब तक कि आप को बनाए रखना संभवत: आपके लिए बेकार है।
Apple के अपने शब्दों में, अनुरक्षण "आम तौर पर स्मृति प्रबंधन मुद्दों को डीबग करने में कोई मूल्य नहीं है"।
बेशक, आपको अपने कोड में रिटेनकाउंट विधि का उपयोग कभी नहीं करना चाहिए, क्योंकि इसके मूल्य का अर्थ इस बात पर निर्भर करता है कि ऑब्जेक्ट पर कितने ऑटोरेलिट लागू किए गए हैं और यह ऐसी चीज है जिसका आप अनुमान नहीं लगा सकते हैं। हालांकि यह डिबगिंग के लिए बहुत उपयोगी है - खासकर जब आप कोड में मेमोरी लीक का शिकार कर रहे हैं जो मुख्य ईवेंट लूप के बाहर एपकिट ऑब्जेक्ट्स के तरीकों को कॉल करता है - और इसे पदावनत नहीं किया जाना चाहिए।
अपनी बात को गंभीरता से बताने के प्रयास में आपने मूल्य के असंवेदनशील स्वरूप को गंभीरता से लिया है। यह सच है कि यह हमेशा एक संदर्भ गणना नहीं है। कुछ विशेष मूल्य हैं जो झंडे के लिए उपयोग किए जाते हैं, उदाहरण के लिए यह इंगित करने के लिए कि किसी वस्तु को कभी नहीं हटाया जाना चाहिए। 1152921504606846975 जैसी संख्या बहुत ही रहस्यमय लगती है जब तक कि आप इसे हेक्स में लिखते हैं और 0xfffffffffffff प्राप्त करते हैं। और 922337203685474780807 हेक्स में 0x7fffffffffffffff है। और यह वास्तव में इतना आश्चर्य की बात नहीं है कि कोई व्यक्ति झंडे के रूप में इन जैसे मूल्यों का उपयोग करना पसंद करेगा, यह देखते हुए कि रिटेनकाउंट पाने के लिए लगभग 3000 साल लगेंगे जितनी बड़ी संख्या, आप प्रति सेकंड 100,000,000 बार रिटेनकाउंट बढ़ाएंगे।
इसका उपयोग करने से आपको क्या समस्याएं हो सकती हैं? यह सब कुछ ऑब्जेक्ट की रिटेन काउंट लौटाता है। मैंने इसे कभी नहीं बुलाया और किसी भी कारण से नहीं सोच सकता कि मैं करूंगा। मैंने यह सुनिश्चित करने के लिए इसे एकल में ओवरराइड कर दिया है, हालांकि यह सुनिश्चित नहीं किया गया है कि वे समाप्त नहीं हुए हैं।
retainCount
मेमोरी प्रबंधन के लिए उपयोग करते हैं।
जब तक आपका ऐप उठ रहा है और चल रहा है और कुछ उपयोगी काम कर रहा है, तब तक आपको मेमोरी लीक होने की चिंता नहीं होनी चाहिए।
एक बार जब यह है, तो इंस्ट्रूमेंट्स को आग लगा दें और ऐप का उपयोग करें और देखें कि क्या मेमोरी लीक वास्तव में होता है। ज्यादातर मामलों में आपने खुद एक ऑब्जेक्ट बनाया (इस प्रकार आप इसके मालिक हैं) और आपके किए जाने के बाद इसे जारी करना भूल गए।
अपने कोड को आज़माएं और अनुकूलित न करें क्योंकि आप इसे लिख रहे हैं, आपके अनुमानों के अनुसार मेमोरी लीक हो सकती है या बहुत अधिक समय लग सकता है जब आप वास्तव में सामान्य रूप से ऐप का उपयोग करते हैं तो अक्सर गलत होते हैं।
कोशिश करें और सही कोड लिखें जैसे यदि आप आवंटित और इस तरह का उपयोग करके कोई ऑब्जेक्ट बनाते हैं, तो सुनिश्चित करें कि आप इसे ठीक से जारी करते हैं।
-retainCount
।