iOS: didReceiveMemoryWarning की असहायता:

वोट
12

मैं क्रैश होने और मेमोरी लीक पर नज़र रखने के लिए अपने विकास की प्रक्रिया के हिस्से में हूँ। एक रणनीति के रूप में, आप में किसी भी NSLog संदेश या कुछ इस तरह की सूचनाएं रखूँ didReceiveMemoryWarning:? इस विधि के लिए प्रलेखन बल्कि विरल है। यह कहना है कि इससे पहले कि एक दुर्घटना नहीं होगा, UIViewController कि विधि को गति प्रदान करेगा सही है? यहां तक कि उपकरण के साथ आगे जाने से पहले एक प्रारंभिक बिंदु है कि है?

24/02/2009 को 17:15
का स्रोत उपयोगकर्ता
अन्य भाषाओं में...                            


4 जवाब

वोट
28

ठीक है, कई बातें ध्यान रखें:

  • didReceiveMemoryWarning एक आउट-ऑफ-स्मृति दुर्घटना से पहले बुलाया जाएगा। अन्य नहीं क्रैश। आप चेतावनी ठीक से संभाल और मेमोरी खाली है, तो आप बाहर के स्मृति हालत से बच सकते हैं और क्रैश नहीं।
  • आप मैन्युअल रूप से हार्डवेयर मेनू के तहत सिम्युलेटर में एक स्मृति चेतावनी को गति प्रदान कर सकते हैं। अत्यधिक didReceiveMemoryWarning के अपने को संभालने का परीक्षण करने के ऐसा करने की सलाह देते हैं।
  • उपकरण आप लीक डिबग में मदद करता है (हालांकि उनमें से सभी नहीं) - यह वास्तव में नहीं है कि दुर्घटनाओं के लिए उपयोगी है।
  • नहीं, मैं व्यक्तिगत रूप से NSLog का उपयोग नहीं करते - मैं सिर्फ स्मृति चेतावनी जब मैं डिबगिंग रहा हूँ ब्रेकपाइंट।
24/02/2009 को 18:20
का स्रोत उपयोगकर्ता

वोट
5

यदि उपयोगकर्ता छोड़ दिया कुछ ऐप्लिकेशन खोलते हैं तो आप अपने निपटान में बहुत कम स्मृति होगा। इसलिए कभी-कभी didReceiveMemoryWarningउपयोग के 1 एमबी के बाद ही प्रणाली द्वारा कहा जा सकता है।

प्रणाली अपने सभी दृश्य नियंत्रकों पर इस प्रणाली को बुलाती है, अगर आप अपने दृश्य नियंत्रक से प्रत्येक में एक NSLog जगह है, तो आप देखेंगे कि।

फिर स्वचालित रूप से विधि viewDidUnloadअपने सभी दृश्य नियंत्रक (नहीं पर प्रणाली द्वारा बुलाया जाएगा dealloc)। तो तुम वहाँ में अपने सभी आवंटन रद्द निर्देश पर रखना होगा।

आप उन परीक्षणों का एक बहुत बनाने के लिए, क्योंकि यदि आपका ऐप्स जटिल है कि आप इसे अच्छी तरह से प्रबंध से पहले दुर्घटनाओं की बहुत का सामना करना पड़ेगा की है।

22/09/2011 को 08:00
का स्रोत उपयोगकर्ता

वोट
4

अद्यतन iOS 6 के रूप में, UIViewControllerविचारों नहीं रह गया है स्मृति चेतावनी के जवाब में उतार दिया है। इसके बजाय बस किसी भी संसाधनों आप यथोचित पुन: बना सकते हैं (जैसे संचित डेटा) जारी करने के लिए जब अपने सबसे अच्छे करना didReceiveMemoryWarningकहा जाता है।

अद्यतन
मैं अपने मूल जवाब लिखा जब मैं एक एंग्री यंग मैन था, समय बदल गया है और मूल रूप से, यह गलत है।

आप एक ही दृश्य नियंत्रक के साथ एक ऐप है और आप एक स्मृति चेतावनी प्राप्त करते हैं, वहाँ ज्यादा आप कर सकते हैं नहीं है। लेकिन चीजें नाटकीय रूप से बदल यदि आप कई दृश्य नियंत्रक है, क्योंकि आप अनलोड कर सकते हैं सभी राज्य गैर frontmost नियंत्रकों के साथ जुड़े। वास्तव में [UIViewController didReceiveMemoryWarning]के लिए आप अपने गैर दृश्य देखा गया उतारने से सही दिशा में ठेस जाएगा (आश्चर्य!)। जब frontmost दृश्य नियंत्रक को खारिज कर दिया है, अंतर्निहित दृश्य पुनः लोड कर रहा है और अधिक से अधिक उपयोगकर्ता केवल एक देरी के बारे में पता है, भले ही आंतरिक रूप से अपने अनुप्रयोग एक पूरा रिबूट किया है हो सकता है किया जाना चाहिए।

यह कुछ विस्तार से आप आसानी से पुनः स्थापित कर सकते हैं नहीं है, आप शुरू से ही मन में स्मृति उपयोग रखने के लिए और सफाई से unloadable में अपने मल्टीव्यू एप्लिकेशन डिजाइन करने के लिए की जरूरत है UIViewControllerटुकड़े। वास्तव में यह अपने कोड सिम्युलेटर इसकी मेमरी चेतावनी सुविधा का उपयोग करने के साथ संगत रखने लायक है।

जब स्मृति प्रचुर मात्रा में है, कुछ भी नहीं उतार दिया जाता है और सब कुछ रेशमी चिकनी है, और जब स्मृति कम होने पर बातें, काम और अधिक हालांकि धीरे रहते हैं। अब मैं कहेंगे कि परिमित स्मृति समस्या के लिए इस समाधान आदर्श है।

इस स्मृति पार्लर चाल का लाभ लेने के लिए, ओवरलोड UIViewControllerतरीकों viewDidLoad, viewDidUnloadऔर viewWillUnload(iOS5, उपयोगी अगर उतारने राज्य आपके विचार की आवश्यकता है अभी भी मौजूद हैं करने के लिए, उदाहरण के लिए यदि आप अपने OpenGL संरचना और रिसाव बफर प्रस्तुत करना नहीं चाहते हैं, iOS4 पर आप अनुकरण कर सकते हैं इस अधिक भार से didReceiveMemoryWarningऔर आपके विचार की दृश्यता पर नज़र रखने)।

मूल, अधिक bilious उत्तर

didReceiveMemoryWarning बिल्कुल बेकार है।

वहाँ आप ऊपर स्मृति मुक्त करता है, तो यह है कि कोई गारंटी नहीं है (यहां तक ​​कि सभी इसके बारे में) है कि आप मारे नहीं होगा।

मेरी कड़वा अनुभव में यह आम तौर पर 2.x / 3.0 पर इस तरह काम करता है:

  1. mediaserverd स्मृति का एक समूह लीक

  2. मेरे ऐप को मार डाला जाता है

दुर्भाग्य से, काटनेवाला mediaserverd की हत्या के कभी नहीं सोचता है।

तो अगर स्मृति उपयोग आपकी गलती नहीं है, तो आप वास्तव में केवल दो विकल्प मिल गया है:

  1. रिबूट करने के लिए कहें (उपयोगकर्ता मान लिया गया यह आपकी गलती है, एक कटु समीक्षा लिखता है)

  2. आशा है कि अपराधी दुर्घटनाओं (mediaserverd अक्सर बाध्य!)

25/06/2009 को 11:41
का स्रोत उपयोगकर्ता

वोट
3

didReceiveMemoryWarning का उद्देश्य आप स्मृति मुक्त या विचारों पॉप एक दुर्घटना से बचने के लिए करने का मौका दे रहा है। आप किसी भी उम्मीद के मुताबिक बिंदु पर प्राप्त नहीं होगा, क्योंकि यह क्या उपयोगकर्ता कर रहा है पर निर्भर करता है। उदाहरण के लिए, यदि उपयोगकर्ता आइपॉड सुन रहा है, वहाँ कम उपलब्ध स्मृति है और आप इसे जितनी जल्दी प्राप्त होगा।

अंगूठे का सामान्य नियम आप रैम के साथ काम करने के 8MB के बारे में होता है। जब आप उस के करीब आप घटना उठाया जा करने की उम्मीद कर सकते हैं। आपको उतनी अधिक RAM ले रहे हैं, तो जानबूझ कर आप इसके बारे में कुछ करने के लिए एक योजना होनी चाहिए।

24/02/2009 को 19:34
का स्रोत उपयोगकर्ता

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more