50 बार देखा गया आप की तरह एक बड़ा स्मृति हॉग की तरह लगता है का वर्णन। तो मुझे संदेह है कि स्मृति प्रबंधन कुछ विचारों को उतार रहा है। फिर जब आपके कार्यक्रम को विचारों की आवश्यकता होती है, तो वे वहां नहीं होते हैं और आपका प्रोग्राम दुर्घटनाग्रस्त हो जाता है। त्रुटि संदेश यह बिल्कुल फिट नहीं है, लेकिन यह आपको सटीक रूप से बता नहीं सकता कि समस्या क्या है।
निम्नलिखित संभावित परिदृश्य पर विचार करें, और देखें कि यह इस कार्यक्रम को कैसे कोडित करता है या नहीं।
ओएस को स्मृति प्रबंधित करने के लिए, यह दृश्यों को अनलोड कर सकता है और आवश्यकतानुसार उन्हें पुनः लोड कर सकता है। जब यह किया जाता है, तो विधियों को देखते हैं DidUnload, loadView, और viewDidLoad कहा जाता है।
viewDidUnload:
इस विधि viewDidLoad विधि करने के लिए एक समकक्ष के रूप में कहा जाता है। इसे कम-स्मृति स्थितियों के दौरान बुलाया जाता है जब व्यू कंट्रोलर को अपना दृश्य और उस दृश्य से जुड़े किसी ऑब्जेक्ट को स्मृति मुक्त करने की आवश्यकता होती है। चूंकि नियंत्रक अक्सर विचारों और अन्य दृश्य-संबंधित वस्तुओं के संदर्भ संग्रहीत करते हैं, इसलिए आपको उन ऑब्जेक्ट्स में स्वामित्व को छोड़ने के लिए इस विधि का उपयोग करना चाहिए ताकि उनके लिए स्मृति को पुनः दावा किया जा सके। आपको केवल उन ऑब्जेक्ट्स के लिए ऐसा करना चाहिए जिन्हें आप बाद में आसानी से फिर से बना सकते हैं, या तो आपके दृश्य में डिडलोड विधि या आपके एप्लिकेशन के अन्य हिस्सों से। आपको उपयोगकर्ता डेटा या किसी अन्य जानकारी को रिलीज़ करने के लिए इस विधि का उपयोग नहीं करना चाहिए जिसे आसानी से पुनर्निर्मित नहीं किया जा सकता है।
loadView:
दृश्य नियंत्रक इस विधि जब दृश्य संपत्ति का अनुरोध किया, लेकिन वर्तमान में नहीं के बराबर है है कहते हैं। यदि आप मैन्युअल रूप से अपने विचार बनाते हैं, तो आपको इस विधि को ओवरराइड करना होगा और अपने विचार बनाने के लिए इसका उपयोग करना होगा। यदि आप अपने विचार बनाने के लिए इंटरफ़ेस बिल्डर का उपयोग करते हैं और दृश्य नियंत्रक को प्रारंभ करते हैं- यानी, आप initWithNibName का उपयोग करके दृश्य प्रारंभ करते हैं: बंडल: विधि, nibName और nibBundle गुणों को सीधे सेट करें, या इंटरफेस बिल्डर में अपने विचारों को देखें और नियंत्रक देखें- तो आपको इस विधि को ओवरराइड नहीं करना चाहिए।
चेक UIView कक्षा संदर्भ -
viewDidLoad:
के बाद दृश्य नियंत्रक स्मृति में उसके संबंधित विचारों के लोड होते ही इस विधि कहा जाता है। इस विधि को इस पर ध्यान दिए बिना कि क्या दृश्य nib फ़ाइल में संग्रहीत किए गए थे या loadView विधि में प्रोग्रामेटिक रूप से बनाए गए थे। इस विधि का उपयोग आमतौर पर एनआईबी फाइलों से लोड किए गए विचारों पर अतिरिक्त प्रारंभिक चरणों को करने के लिए किया जाता है।
आपने अनजाने में इन दृश्यों को अपने लोड व्यू विधियों के बजाय अपने इनिट विधियों में प्रारंभ किया हो सकता है। यदि आपने ऐसा किया है, तो जब ओएस दृश्य को अनलोड करता है (आप देखेंगेडयूनलोड कहा जाता है) दृश्य से जुड़े स्मृति और सभी सबव्यूज़ (सभी छवियों और एनिमेशन) को अनलोड किया जाएगा। यह स्मृति को बचाता है, लेकिन जब आपको फिर से दिखाई देने वाले उन अनलोड किए गए दृश्यों में से एक की आवश्यकता होती है, तो दृश्य दृश्य को पहले अनलोड किए जाने पर लोडव्यू को पहले कॉल किया जाएगा। यदि आपका व्यू सेटअप लोड व्यू के बजाय init विधियों में किया जाता है, तो दृश्य फिर से सेटअप नहीं किया जाएगा। लेकिन अगर दृश्य सेटअप loadView विधि में किया जाता है, तो इसे स्मृति प्रबंधन के बाद इसे पुनर्प्राप्त करने के बाद पुनर्प्राप्त किया जा सकता है।
क्या आपने यह देखने के लिए "विश्लेषक" चलाने की कोशिश की है कि उसे कोई संभावित लीक मिलती है या नहीं? – 5StringRyan
@ हंसग्रिबर: हाँ हमने मेमोरी लीक के साथ दौड़ने की कोशिश की लेकिन हमारे पास कोई लीक नहीं मिला। कृपया कोई अन्य समाधान कृपया .. धन्यवाद .. –
विश्लेषक और लीक विभिन्न उपकरण हैं। एक स्थैतिक क्लैंग विश्लेषक है जिसे आप न केवल स्मृति लीक बल्कि कोड में अन्य समस्या स्पॉट खोजने के लिए उपयोग कर सकते हैं। समय-समय पर इसे चलाने का अच्छा विचार है। ध्यान दें कि स्थैतिक क्लैंग विश्लेषक उपकरण के तहत नहीं चलता है और यह एक प्रोफाइलिंग उपकरण नहीं है। आप इसे उत्पाद मेनू के अंतर्गत पाएंगे। "उत्पाद> विश्लेषण"। दूसरी तरफ लीक ऑब्जेक्ट्स की निगरानी के लिए एक प्रोफाइलिंग टूल है, यह देखने के लिए कि क्या ऑब्जेक्ट के सभी संदर्भों को हटा दिए जाने के बाद उन्हें रिहा नहीं किया गया है। – Sam