2012-05-18 4 views
5

यहाँ सरलीकृत कोड का एक टुकड़ा है। सामान्य फिक्स उचित स्थानों पर फ़ील्ड को रद्द करना है। उदाहरण के लिए, onPause() में के लिए:क्या यह एक एंड्रॉइड संदर्भ रिसाव है?</p> <pre><code>static Activity longLivedField; onCreate(...) { longLivedField = this; // the only write to this field } </code></pre> <p>मैं लोगों को एक संदर्भ रिसाव के रूप में इस का दावा, और इसके लिए फिक्स बनाने देखा है:

onPause() { 
    longLivedField = null; 
} 
+0

आप इस संदर्भ रखने के लिए क्या कर रहे हैं:

Android डेवलपर वेब साइट एक आसान पेज इस तरह मेमोरी लीक से बचने के लिए कैसे का वर्णन होता है? – accordionfolder

+0

हां। और सुझाव हैं कि हमें यह नहीं करना चाहिए, लेकिन इसके बजाय getAplicationContext() का उपयोग करें। लेकिन मैं सिर्फ यह समझना चाहता हूं कि ऐसा क्यों करना एक समस्या हो सकती है। – dacongy

उत्तर

3

हाँ, यह एक स्मृति रिसाव अगर आप (onPause में क्षेत्र को रद्द नहीं है) है। आप लगभग निश्चित रूप से किसी भी गतिविधि के लिए एक स्थिर संदर्भ बनाए रखना नहीं चाहते हैं। यह क्या है कि आप हासिल करने की कोशिश कर रहे हैं?

Avoiding Memory Leaks

+0

मैंने उस पोस्ट को कई बार पहले पढ़ा था। हालांकि, अंतर यह है कि स्थैतिक क्षेत्र केवल उस उदाहरण में एक बार लिखा जाता है। लेकिन इस में, स्थैतिक क्षेत्र हर बार एक नई गतिविधि वस्तु बनने के लिए लिखा जाएगा (ठीक है, जब ऑनक्रेट() वास्तव में कहा जाता है), और इस प्रकार पुराना (जिसे एक * लीक किया जाना चाहिए) नहीं है स्थिर क्षेत्र से अधिक पहुंच योग्य। तो ऐसा लगता है कि यह केवल थोड़े समय के लिए लीक हो सकता है, जो मोटे तौर पर बोल रहा है, पॉज़() और ऑन्रेट() में असाइनमेंट के बीच है। – dacongy

+2

यह सच है, लेकिन रिसाव तब होगा जब उपयोगकर्ता एक अलग गतिविधि में चलेगा। स्थिर क्षेत्र तब आपकी गतिविधि के अंतिम उदाहरण को इंगित करेगा और इस प्रकार रिसाव करेगा। –

+1

यहां मेरे उत्तरों के आधार पर मेरी समझ है, और यदि मैं गलत हूं तो मुझे सही करें: लक्ष्य यह है कि जब उपयोगकर्ता एक अलग गतिविधि में जाता है तो गतिविधि के आखिरी उदाहरण को कचरा करना संभव बनाता है। ऐसा करना महत्वपूर्ण है क्योंकि एक गतिविधि के पूरे जीयूआई पदानुक्रम (मैं इसे स्पष्ट रूप से कहना चाहता हूं क्योंकि कई गतिविधियों में लीक या यहां तक ​​कि कई ऐप्स स्पष्ट रूप से हानिकारक हैं) काफी मात्रा में स्मृति का उपभोग कर सकते हैं। ऐसा करना उचित है क्योंकि कचरा संग्रह और ऑब्जेक्ट आवंटन पर्याप्त रूप से जीयूआई पदानुक्रम को इकट्ठा करने और आवंटित करने के लिए पर्याप्त कुशल हैं। – dacongy