2010-07-27 19 views
6

मेरे पास एक दृश्य नियंत्रक है जो UITextField दिखा रहा है।कीबोर्ड पर मेमोरी लीक

- (void)cancel:(id)sender 
{ 
    if([wordTextField isFirstResponder]) 
    { 
     [wordTextField resignFirstResponder]; 
    } 

} 

इस उपकरण के बाद मुझ में पर

# Category Event Type Timestamp RefCt Address Size Responsible Library Responsible Caller 
0 Malloc 128 Bytes Malloc 00:11.239 1 0x3b82550 128 UIKit UIKeyboardInputManagerClassForInputMode 

कहीं एक रिसाव दिखाएगा: यहाँ मैं कुंजीपटल

- (void)viewDidAppear:(BOOL)animated 
{ 
    [wordTextField becomeFirstResponder]; 
} 

तब मैं बटन जो नियंत्रक ही बंद किए बिना कुंजीपटल खारिज किया जाता है लाना स्टैक [wordTextField resignFirstResponder] का उल्लेख किया गया।

भले ही मैं स्वयं कीबोर्ड नहीं लाता और उपयोगकर्ता को इसे ट्रिगर करने देता हूं, फिर भी मुझे रिसाव है। इस मामले में स्टैक में उल्लिखित मेरे कोड से कुछ भी नहीं है।

+0

बस परीक्षण के लिए मैंने एकल 'यूआईटीएक्स्टफाल्ड' के साथ नया दृश्य आधारित प्रोजेक्ट बनाया है, और कुछ नहीं। टेक्स्ट फ़ील्ड पर टैप करने के लिए केबीआई लाएगा और उपर्युक्त मेमोरी रिसाव का कारण बन जाएगा। मैं इंस्ट्रूमेंट्स 2.1 और एक्सकोड 3.2.2 का उपयोग कर रहा हूं। क्या मुझे इस रिसाव को अनदेखा करना चाहिए? – Pablo

+0

सिम्युलेटर या डिवाइस? यदि यह डिवाइस कृपया एक नमूना परियोजना पोस्ट करें, इसे देखने के लिए उत्सुक है। –

+0

यह सिम्युलेटर है, लेकिन अभी भी सुनिश्चित करने में रुचि रखते हैं। आज बाद में डिवाइस पर जांच करेगा। मेरे मूल प्रोजेक्ट में इस के साथ मेरे पास 2 'open_handle_to_dylib_path' है, जहां तक ​​मैं googling से समझता हूं सिम्युलेटर के साथ झूठा अलार्म हो सकता है। लेकिन 'UIKeyboardInputManagerClassForInputMode' के बारे में कुछ भी नहीं मिला, तो कुछ गंभीर हो सकता है। – Pablo

उत्तर

7

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

लीक्स स्मृति के इन हिस्सों को 'लीक्स' के रूप में पहचानेंगे और यह बुरा लगता है, लेकिन यह वास्तव में 'लीक' नहीं है कि उपकरण पहचानने में आपकी मदद करने के लिए है।

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

तो यदि आपके पास कोई ऐप है तो इससे कोई फर्क नहीं पड़ता कि आप इसका कितना समय उपयोग करते हैं या इससे कोई फर्क नहीं पड़ता कि आप इसका उपयोग कैसे करते हैं, यह एक सेब फ्रेमवर्क में 128 बाइट्स को लीक करता है जिसे आपको आमतौर पर चिंता करने की ज़रूरत नहीं होती है।

हालांकि, यदि आपके पास कोई ऐप है जो कहता है, हर बार जब आप एक बटन पर क्लिक करते हैं तो यह एक नई स्ट्रिंग आवंटित करता है जिसे कभी जारी नहीं किया जाता है - इससे कोई फर्क नहीं पड़ता कि स्ट्रिंग कितनी बाइट्स है - यदि उपयोगकर्ता ने बटन को पर्याप्त बार दबाया तो यह उपभोग करेगा ऐप के लिए उपलब्ध सभी मेमोरी और अंत में इसे दुर्घटनाग्रस्त कर दिया। यह ऐसी रिसाव है जिसकी आपको आवश्यकता है।

लीक उपकरण वास्तव में दो प्रकार के बीच अंतर नहीं बता सकता है, लेकिन आपको सक्षम होने की आवश्यकता है। आप एक प्रकार का सिंगलटन ऑब्जेक्ट चाहते हैं, उदाहरण के लिए, केवल एक ही उदाहरण है, और यह आपके ऐप के पूरे जीवनकाल के लिए मौजूद होना चाहिए। आप ऐप स्टार्टअप पर ऑब्जेक्ट बनाते हैं और वास्तव में आपको इस ऑब्जेक्ट को मुक्त करने की आवश्यकता नहीं होती है, जब ऐप निकलता है तो इसे मार दिया जा सकता है। लीक्स इसे एक रिसाव के रूप में ध्वजांकित करेंगे, और कुछ अन्य डेवलपर्स जिन्हें आप काम करते हैं, इसका मानना ​​है कि इसका मतलब यह नहीं है कि आप नहीं जानते कि आप क्या कर रहे हैं अपने बच्चे को छोटे बच्चे की तरह चलाएंगे और कहेंगे "वह वास्तव में लीकी कोड लिख रहा है, और वह वास्तव में बुरा "। और आपका मालिक, जो प्रोग्रामर नहीं है उसे गंभीरता से ले जाएगा क्योंकि यह खराब लगता है और फिर भी उसने एक प्रतिष्ठित विश्वविद्यालय से सीएस में 2.2 को तोड़ दिया ताकि उसे पता होना चाहिए कि वह किस बारे में बात कर रहा है। जब वास्तव में यह पूरी तरह से उचित है और वास्तव में आप क्या करना चाहते हैं।

तो, अपने कोड में बग खोजने के लिए लीक्स उपकरण का उपयोग करें जो आपके ऐप को बर्बाद कर देगा। एक ऐप्पल ढांचे में 'लीकिंग' पाया गया हर बाइट के बारे में चिंता न करें।

+0

@iPhoneDev: धन्यवाद। बीटीडब्ल्यू, डिवाइस पर उपकरण में उत्पादित कोई ऐसी रिसाव नहीं थी। – Pablo

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