2010-07-06 15 views
6

जब एप्लिकेशन पृष्ठभूमि चलने वाले राज्य में प्रवेश करता है, तो कितनी गंदे स्मृति उपयोग जाने के लिए अच्छा होता है। सेब वीडियो में यह उल्लेख किया गया है कि गंदे स्मृति को जितना संभव हो उतना कम किया जाना चाहिए।आईओएस 4 - तेज़ संदर्भ स्विचिंग

लेकिन मेरे ऐप में, मैं पुश और पॉप दृश्यों के लिए नेविगेशन नियंत्रक का उपयोग कर रहा हूं। लगभग 20 अलग-अलग पृष्ठों से आगे बढ़ने के बाद, गंदा स्मृति उपयोग 30 एमबी या उससे भी अधिक तक पहुंच जाता है।

"dismissModalViewControllerAnimated" और "popViewControllerAnimated" पर भी, dealloc नहीं कहा जाता है।

मैं दो संदेह है

  1. गंदा कितनी स्मृति को प्रसारित करने के स्वीकार्य है के साथ?
  2. बैक बटन का समर्थन करने के लिए नेविगेशन नियंत्रक का वैकल्पिक क्या है?

अग्रिम धन्यवाद।

+0

1. 30 एमबी नहीं। पुराने आईओएस उपकरणों में केवल 128 एमबी रैम है, इसलिए आपका ऐप अकेले ही 23% के लिए भर जाएगा ... 2. यदि आप वास्तव में 30 एमबी लीक कर रहे हैं, तो शायद आप कुछ जारी नहीं कर रहे हैं, कहीं, यह 'UINavigationController' नहीं है गलती –

+0

हाय डूवे, उत्तर देने के लिए धन्यवाद। मुझे UINavigationController पर संदेह क्यों है क्योंकि, मैं इसमें दृश्य नियंत्रकों को धक्का देता हूं।और जब मैं नेविगेशन नियंत्रक से दृश्य contollers पॉप, जब dealloc विधि कहा जाता है जहां मैं परिभाषित आवृत्ति चर जारी कर रहा हूँ। और इन सभी आवृत्ति चर द्वारा स्मृति को उपयोग नहीं किया जा रहा है। क्या मैं कुछ गलत कर रहा हूं? क्या मुझे कहीं और इवेंट वैरिएबल साफ़ करना है और डेलोक में नहीं है? – Sunil

+0

क्या आपके ऐप में कहीं और आपके दृश्य नियंत्रकों के पास कोई अन्य संदर्भ है? यदि आप उन्हें पॉप-अप कर रहे हैं, लेकिन अभी भी नियंत्रक को कहीं और संदर्भ है, तो उसे जीसीड नहीं मिलेगा – blueberryfields

उत्तर

4

यदि आपके पास Dealloc नहीं कहा जा रहा है तो भी आपके पास अभी भी आपके UIViewControllers को बनाए रखा जा सकता है।

शायद आप इन UIViewControllers में प्रतिनिधियों या अन्य वर्गों को स्थापित कर रहे हैं जो पेड़ (परिपत्र संदर्भ) का बैक अप लेते हैं और संदर्भित करते हैं।

एक तरीका जिसे आप डीबग कर सकते हैं उसे अधिभारित करना और अपने UIViewController में रिलीज़ करना और ब्रेक पॉइंट सेट करना और retainCount लॉग करना है।

यहां एक जादू स्निपेट है जो मैं चारों ओर दौड़ना छोड़ देता हूं जो मुझे एक टन में मदद करता है जब मैं यह नहीं समझ सकता कि मैं अभी भी कुछ क्यों बनाए रख रहा हूं।

- (id)retain 
{ 
    NSLog(@"retain \t%s \tretainCount: %i", __PRETTY_FUNCTION__ , [self retainCount]); 
    return [super retain]; 
} 
- (void)release 
{ 
    NSLog(@"release \t%s \tretainCount: %i", __PRETTY_FUNCTION__ , [self retainCount]); 
    [super release]; 
} 
- (id)autorelease 
{ 
    NSLog(@"autorelease \t%s \tretainCount: %i", __PRETTY_FUNCTION__ , [self retainCount]); 
    return [super autorelease]; 
} 

__PRETTY_FUNCTION__ बजना में एक विशेष छिपा मैक्रो कि एक चार सरणी के रूप में एक बहुत ऑब्जेक्टिव-सी समारोह नाम देता है।

0
  1. जब कोई आईओएस स्मृति से बाहर चलना शुरू करता है तो यह सबसे अधिक स्मृति का उपयोग कर पृष्ठभूमि प्रक्रियाओं को मारने का प्रयास करता है। इसलिए जब कोई पूर्ण संख्या नहीं है, तो आप कितनी मेमोरी का उपयोग करते हैं, यह कम करना एक अच्छा विचार है। इसे 30 एमबी पर छोड़कर यह गारंटी देने की ताकत है कि आपका ऐप
  2. जब तक आप अपना यूआई नहीं बदलना चाहते हैं, तो आपके बैक बटन से निपटने के लिए UINavigationController अन्य किसी भी चीज़ का उपयोग करने की आवश्यकता नहीं है। मुझे लगता है कि समस्या यह है कि अगर dealloc एक पॉप पर बुलाया या खारिज नहीं है, तो आप एक स्मृति रिसाव

लगभग सभी दृश्य नियंत्रकों को प्रभावी ढंग से कैश की गई है और यह कि डेटा पुनर्जीवित किया जा सकता है है है जब अग्रभूमि करने के लिए एप्लिकेशन रिटर्न । ऐप चलने पर आपको स्मृति चेतावनी मिलने पर आपके द्वारा जारी किए जाने वाले डेटा के बारे में सोचें। (आप स्मृति चेतावनियों का जवाब दे रहे हैं, है ना?) यह वह सामान है जिसे आप पृष्ठभूमि में जाने पर रिलीज़ किया जाना चाहिए।

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