2010-05-26 16 views
84

आईफोन ओएस उपकरणों पर स्मृति प्रबंधन की ब्लैक आर्ट के बारे में: स्मृति चेतावनी के विभिन्न स्तरों का क्या अर्थ है। स्तर 1? लेवल 2? क्या डायल 11 पर जाता है?आईफोन ओएस मेमोरी चेतावनी। विभिन्न स्तरों का मतलब क्या है?

संदर्भ: व्यापक मेमोरी तनाव परीक्षण अवधि के बाद - आईपॉड संगीत प्लेयर ऐप के साथ अपना आईपैड ऐप चलाने सहित, मैं यादृच्छिक अभी तक कमजोर स्मृति चेतावनियों को अनदेखा करने के इच्छुक हूं। मेरा ऐप कभी दुर्घटनाओं। कभी। मेरा ऐप रिसाव मुक्त है। और, ठीक है, mems चेतावनियां बस कोई फर्क नहीं पड़ता।

धन्यवाद,
डौग

उत्तर

95

मूल रूप से चेतावनी का मतलब है कि डिवाइस की मेमोरी कम है, और है कि, "आप कुछ स्मृति आप सक्रिय रूप से है कि उपयोग नहीं कर रहे था हो मुक्त कर खुश कर सकता है सूजन! "। यदि आपका मेमोरी प्रबंधन तंग है, और आपके पास ऐसी कोई वस्तु नहीं है जो व्यावहारिक रूप से त्याग दी जा सके, बस संदेश को पास करें और इसे अनदेखा करें।

+25

एलओएल "यदि आप कुछ स्मृति मुक्त कर सकते हैं तो आप सक्रिय रूप से इसका उपयोग नहीं कर रहे हैं!" अनमोल ;-) चीयर्स – dugla

+15

आप आईफोन ओएस वैक-ए-मोल मेमोरी डांस के एक अनुभवी अनुभवी की तरह लगते हैं। – dugla

+1

Rye_ में _ कैचर से लिया गया? 'महान कोड;)' – wagashi

192

स्प्रिंगबोर्ड द्वारा मेमोरी स्तर की चेतावनियां लॉग इन की गई हैं। एक ऐप डेवलपर के रूप में आपको इसकी परवाह करने की आवश्यकता नहीं है। बस -{application}didReceiveMemoryWarning का जवाब देना पर्याप्त है।


चेतावनियों के 4 स्तर (0 से 3) हैं। ये कर्नेल मेमोरी वॉचर से सेट हैं, और not-so-public function OSMemoryNotificationCurrentLevel() द्वारा प्राप्त किए जा सकते हैं।

typedef enum { 
    OSMemoryNotificationLevelAny  = -1, 
    OSMemoryNotificationLevelNormal = 0, 
    OSMemoryNotificationLevelWarning = 1, 
    OSMemoryNotificationLevelUrgent = 2, 
    OSMemoryNotificationLevelCritical = 3 
} OSMemoryNotificationLevel; 

स्तर कैसे ट्रिगर किए जाते हैं, दस्तावेज नहीं है। स्प्रिंगबोर्ड प्रत्येक स्मृति स्तर में निम्न करने के लिए कॉन्फ़िगर किया गया है:

  1. चेतावनी (नहीं सामान्य) - पुन: लॉन्च करें, या देरी अनावश्यक पृष्ठभूमि के स्वत: फिर से लॉन्च जैसे ऐप्लिकेशन मेल।
  2. तत्काल - सभी पृष्ठभूमि ऐप्स से बाहर निकलें, उदा। सफारी और आईपॉड।
  3. गंभीर और परे - कर्नेल ले जाएगा, शायद स्प्रिंगबोर्ड या यहां तक ​​कि रीबूट भी मार डालेगा।

सक्रिय ऐप (जेट्सम) को मारना स्प्रिंगबोर्ड द्वारा नियंत्रित नहीं है, लेकिन launchd है।

+0

इसके लिए धन्यवाद। यह आपके प्रश्न और विलीहम के बीच इस सवाल पर हास्य था। हास्य जीतता है चीयर्स। – dugla

+0

हाय, मुझे एक ही समस्या है। 5 बार से अधिक बार लगातार आवेदन चलाने के बाद, मुझे स्मृति चेतावनी प्राप्त हो रही है। स्तर = 1 20 बार के लिए, लेकिन आवेदन क्रैश नहीं हो रहा है। लेकिन जब मुझे यह संदेश मिलता है, तो स्मृति चेतावनी प्राप्त होती है। स्तर = 2 मेरा आवेदन क्रैश हो रहा है। स्तर 2 लगभग 20 बार दिखाई देने के बाद स्तर 2 दिखाई दे रहा है। मैं अपना एप्लिकेशन क्रैश न करने के लिए कैसे कर सकता हूं। धन्यवाद –

+3

@srik: कम स्मृति का उपयोग करें। – kennytm

12
OSMemoryNotification.h से

,

/* 
** Threshold values for notifications 
*/ 

typedef enum { 
    OSMemoryNotificationLevelAny  = -1, 
    OSMemoryNotificationLevelNormal = 0, 
    OSMemoryNotificationLevelWarning = 1, 
    OSMemoryNotificationLevelUrgent = 2, 
    OSMemoryNotificationLevelCritical = 3 
} OSMemoryNotificationLevel; 

totoal स्मृति चेतावनी (-1,3) के 5 स्तरों।

मेमोरी लेवल चेतावनी विवरण के संबंध में, @ केनीटीएम का जवाब उत्कृष्ट है।

मैं कई संबंधित अंक जोड़ना चाहता हूं जो पीएम और अन्य की मदद कर सकते हैं।


मेमोरी लेवल चेतावनी होने पर आपको क्या करना चाहिए?

इनमें से किसी भी चेतावनियों को प्राप्त करने पर, आपके हैंडलर विधि को किसी भी अनियंत्रित स्मृति को तुरंत मुक्त करके जवाब देना चाहिए। उदाहरण के लिए, UIViewController क्लास का डिफ़ॉल्ट व्यवहार अपने दृश्य को शुद्ध करना है यदि वह दृश्य वर्तमान में दिखाई नहीं दे रहा है; उप-वर्ग अतिरिक्त डेटा संरचनाओं को शुद्ध करके डिफ़ॉल्ट व्यवहार को पूरक बना सकते हैं।एक ऐप जो छवियों के कैश को बनाए रखता है, वह किसी भी छवि को जारी करके प्रतिक्रिया दे सकता है जो वर्तमान में स्क्रीन पर नहीं है।


मेमोरी लेवल चेतावनी का निरीक्षण कैसे करें?

http://developer.apple.com/library/ios/#documentation/iphone/conceptual/iphoneosprogrammingguide/PerformanceTuning/PerformanceTuning.html

से

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

  • applicationDidReceiveMemoryWarning लागू:: अपने एप्लिकेशन प्रतिनिधि की विधि

    UIKit कम स्मृति चेतावनियां प्राप्त करने के कई तरीके जिसमें निम्नलिखित शामिल हैं प्रदान करता है।

  • अपने कस्टम UIViewController उपclass में didReceiveMemory चेतावनी विधि को ओवरराइड करें।
  • UIAplplicationDidReceiveMemoryWarningNotificationnotification प्राप्त करने के लिए पंजीकरण करें।

आपके ऐप के मेमोरी उत्सर्जन कम करने?

  • मेमोरी लीक को हटा दें।
  • संसाधन फ़ाइलों को जितना संभव हो सके छोटे बनाएं।
  • बड़े डेटा सेट के लिए कोर डेटा या SQLite का उपयोग करें।
  • संसाधनों को आलसी लोड करें।
  • थंब विकल्प का उपयोग करके अपना प्रोग्राम बनाएं। http://developer.apple.com/library/ios/#documentation/iphone/conceptual/iphoneosprogrammingguide/PerformanceTuning/PerformanceTuning.html


    बुद्धिमानी से स्मृति को आबंटित करने के लिए कैसे पर

विवरण?

  • autoreleased वस्तुओं के आपके उपयोग कम करें: स्वत: संदर्भ गिनती (एआरसी), यह alloc/init वस्तुओं के लिए बेहतर है और संकलक उचित समय पर आप के लिए उन्हें रिलीज करते हैं। यह अस्थायी वस्तुओं के लिए भी सच है कि अतीत में आपके पास वर्तमान विधि के दायरे से पहले रहने से रोकने के लिए स्वत: समाप्त हो सकता है।
  • संसाधनों पर आकार सीमा लागू करें: एक बड़ी संसाधन फ़ाइल लोड करने से बचें जब कोई छोटा करेगा। उच्च-रिज़ॉल्यूशन छवि का उपयोग करने के बजाय, आईओएस-आधारित उपकरणों के लिए उपयुक्त आकार का उपयोग करें। यदि आप को बड़ी संसाधन फ़ाइलों का उपयोग करना चाहिए, तो किसी भी समय आपको जिस फ़ाइल की आवश्यकता है, उसे केवल के हिस्से को लोड करने के तरीके खोजें।उदाहरण के लिए, की बजाय पूरी फ़ाइल को मेमोरी में लोड करें, मेमोरी और मनमैप फ़ंक्शंस का उपयोग फ़ाइल के हिस्सों को मेमोरी में और बाहर मैप करने के लिए करें। स्मृति में फ़ाइलों को मैप करने के बारे में अधिक जानकारी के लिए जानकारी।
  • असंबद्ध समस्या सेट से बचें: असंबद्ध समस्या सेटों को की गणना करने के लिए मनमाने ढंग से बड़ी मात्रा में डेटा की आवश्यकता हो सकती है। यदि सेट को उपलब्ध होने से अधिक मेमोरी की आवश्यकता है, तो आपका ऐप गणनाओं को पूरा करने में असमर्थ हो सकता है। जब भी संभव हो तो आपके ऐप्स को ऐसे सेट से बचना चाहिए और ज्ञात स्मृति सीमाओं वाली समस्याओं पर काम करना चाहिए।
+1

मुझे अंतिम बुलेट बिंदु पसंद है, "एक अलग कार्यक्रम बनाएं।" – Brent

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