2014-10-10 10 views
8

कस्टम कुंजीपटल iOS 8कस्टम कुंजीपटल iOS 8 में स्मृति दबाव

शुरू में अपने कस्टम कुंजीपटल स्मृति के 25 एमबी के आसपास ले जा रहा है में स्मृति दबाव के कारण समाप्त हो के कारण समाप्त हो, लेकिन इस स्मृति पुनः आवंटित की जाती नहीं है साथ मैं dissmiss कुंजीपटल। जब हम कस्टम कीबोर्ड को बार-बार खोलते हैं तो मेमोरी बढ़ती रहती है और अंत में स्मृति दबाव के कारण समाप्त हो जाती है।

इस मुद्दे के साथ मेरी मदद करें?

+0

क्या आप अपना कोड पोस्ट कर सकते हैं जहां आप वास्तव में इस मुद्दे का सामना कर रहे हैं? – iGW

उत्तर

1

कुंजीपटल विस्तार एक प्रक्रिया है कि के बाद गायब हो जाता है कुंजीपटल बनी रहती है में चलता है की ViewWillDisappear समारोह में कुछ बातें dealloc कर सकते हैं। जब भी आपका कीबोर्ड बनाया जाता है, तो आपके कीबोर्ड नियंत्रण नियंत्रक को नया बना दिया जाता है, लेकिन नियंत्रक को देखने वाली प्रक्रिया बनी रहती है। तो जब आपका व्यू कंट्रोलर बंद हो जाता है तो मुफ्त मेमोरी। यदि आप छवियों का उपयोग कर रहे हैं तो आप छवि का उपयोग नहीं करना चाहेंगे नाम: आप imageWithContentsOfFile का उपयोग करना चाहेंगे:। चूंकि UIImage छवि के लिए कैश का उपयोग करता है नामित किया जाएगा। पहले एक कुंजीपटल गायब हो जाता है

1

मैं तरीके इस प्रसिद्ध स्मृति संचय मुद्दे से बचने के लिए की टन की कोशिश की है, लेकिन & त्रुटियों मेरी लंबे परीक्षण के अनुसार, सबसे अच्छा और आसान तरीका सभी स्मृति को मुक्त करने के KeyboardViewController की viewWillDisappear में exit(0) कॉल करने के लिए है ।

- (void)viewWillDisappear:(BOOL)animated { 
    [super viewWillDisappear:animated]; 
    exit(0); 
} 

[अपडेट]exit(0) सभी स्मृति को रिहा करने के बाद से यह कीबोर्ड विस्तार प्रक्रिया को मारता है सही था। दुर्भाग्य से ऐसा लगता है कि प्रक्रिया को मारने से आईओएस अस्थिर हो जाता है।
नतीजतन, सबसे स्थिर तरीका सभी आवंटित वस्तुओं को viewWillDisappear में जितना संभव हो सके जारी करना है। उदाहरण के लिए,

सभी कस्टम दृश्य के लिए और सभी कस्टम दृश्य नियंत्रकों के लिए

  • ऐसे subviews, बाधाओं, इशारों, मजबूत प्रतिनिधि, और इतने पर के रूप में देखा गया और दृश्य नियंत्रकों, के सभी मजबूत संदर्भ निकाल दें।

    [aView removeFromSuperview]; 
    [aView removeConstraints:aView.constraints]; 
    for (UIGestureRecognizer *recognizer in aView.gestureRecognizers) 
        [aView removeGestureRecognizer:recognizer]; 
    
  • सेट nil दृश्य नियंत्रकों के सभी वस्तु संपत्तियों के लिए।

    aViewController.anObject = nil; 
    

अन्य बड़े कस्टम के लिए वस्तुओं

  • सभी सरणियों, शब्दकोशों से सभी जोड़ा घटक हटा दें, और इतने पर।

    [anArray removeAllObjects]; 
    
  • कैश छवियों imageNamed: का उपयोग नहीं करते हैं।

तो अच्छी तरह से जारी किया है, स्मृति उपयोग डिबगिंग या वृद्धि होगी नहीं किया जा बहुत थोड़ी वृद्धि हुई (नकारने प्रति < 0.1MBytes), जबकि। यदि कई वस्तुओं को छोड़ने के बाद स्मृति उपयोग में वृद्धि हुई है, भले ही कस्टम ऑब्जेक्ट्स जितना संभव हो सके, बाहर निकलें (0) को अनलोडिंग के कुछ जोखिमों के साथ समय-समय पर बुलाया जा सकता है।

+0

मैं आपके जैसे इस मुद्दे से निपट रहा हूं। मैंने 'बाहर निकलने की कोशिश की है (0);' इसका सुपर प्रभावी। यह बस प्रक्रिया को मारता है। हालांकि यह कुंजीपटल धीमा कर देगा हर बार इसे कॉल करें। मुझे लगता है कि आईओएस ने कीबोर्ड को तेज प्रक्रिया के लिए कैश किया है। मैंने सभी सबव्यूव्स, बाधाओं को हटाने की कोशिश की है, लेकिन ऐसा लगता है कि प्रक्रिया अभी भी वहां है, और जब भी मैं कीबोर्ड का उपयोग करता हूं तब भी स्मृति में वृद्धि होती है :( – TomSawyer

+0

सामान्यतः, आपके द्वारा बनाए गए सभी कस्टम "ऑब्जेक्ट्स" को हटाया जाना चाहिए पहले से पहले प्रकट होना चाहिए गायब हो गया। लेकिन बिंदु यह है कि आपको आईओएस मेमोरी लीक और अंततः कीबोर्ड क्रैश को रोकने के लिए कस्टम कस्टम दृश्यों और बाधाओं को हटा देना चाहिए। जांचें कि क्या आपने सरणी, शब्दकोश, सेट या जो भी ऑब्जेक्ट्स को हटाया है, बनाया है। यह वास्तव में कष्टप्रद है लेकिन काम करता है। – NeonBerry

+0

मैंने सभी ऑब्जेक्ट्स को हटा दिया है: क्लास इंस्टेंस, बाधाएं, विचार, शब्दकोश ... और कुछ ऐप्स जैसे (viber) चलाने में विफल रहे हैं, मुझे नहीं पता क्यों। कुछ चर छोड़ना होगा। और यदि मैंने पहले से ही सभी विचारों को हटा दिया है, तो क्या मुझे बाधाओं और इशारा को हटाने की ज़रूरत है? असल में, अगर मैंने विचार हटा दिए हैं, तो बाधाएं स्वचालित रूप से आर हो सकती हैं भी उत्सुक – TomSawyer

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