2014-07-08 5 views
9

डब्ल्यूपीएफ और विनआरटी में यह अच्छी तरह से जाना जाता है कि व्यवहार विश्वसनीय रूप से उनकी डिटेच विधि को कॉल नहीं करते हैं। मेमोरी रिसाव से बचने का एकमात्र तरीका एसोसिएटेड ऑब्जेक्ट की अनलोडेड घटना की सदस्यता लेना और सभी घटनाओं को अनदेखा करना है (example)।साइड इफेक्ट्स के बिना व्यवहार को अलग/अनलोड करने का कोई सुरक्षित तरीका है?

अभी तक यह काम करता है।

लेकिन मुझे एहसास हुआ (जैसा कि किसी और ने ब्लॉग एंट्री पर लिंक किया था) जैसा कि इस तरह से अनलोड किए गए व्यवहार कभी भी संलग्न नहीं होते हैं। उदाहरण के लिए मेनूफ्लोआउट लें। यदि MenuFlyoutItem से जुड़ा कोई व्यवहार है, तो यह मेनूफ्लोआउट इटैम बंद होने पर अनलोड हो जाता है। यदि आप मेनू को फिर से खोलते हैं तो इसे फिर से नहीं जोड़ा जाएगा।

यह अन्य UserControls के साथ भी होता है। जब मैं अपने WinRT ऐप में एक पृष्ठ से दूसरे पृष्ठ पर नेविगेट करता हूं और फिर वापस आ जाता हूं तो सभी "नियंत्रण" को फिर से बनाते हैं, हालांकि सभी नियंत्रण फिर से बनाए जाते हैं। मैं नहीं देखता कि मैं उन्हें WinRT ऐप में कैसे उपयोग कर सकता हूं जहां आसपास के नेविगेट करके बहुत सारे नियंत्रण बनाए जाते हैं।

क्या इसका कोई समाधान ज्ञात है?

+0

शायद मैं कुछ याद कर रहा हूँ, लेकिन अगर आप को अनलोड पर अलग करने कर रहे हैं, तो आप सिर्फ भी लोड पर संलग्न करने के लिए नहीं होता? – McGarnagle

+0

@McGarnagle आपकी टिप्पणी के लिए धन्यवाद। चूंकि एक्सएमएल में मेरे व्यवहार बनाए गए हैं, इसलिए मेरे पास जुड़े समय का कोई नियंत्रण नहीं है। बाद में उन्हें मैन्युअल रूप से संलग्न करने के लिए एक संदर्भ को पकड़ना फिर से एक स्मृति रिसाव का कारण हो सकता है। फ्यूथर मुझे यकीन नहीं है कि मैं कोड में नया व्यवहार बनाने के लिए यह कैसे छोटा करूंगा। – Amenti

+0

ऐसा लगता है कि आपको दो मामलों के बीच अंतर करना है। सबसे पहले, जहां आपकी ऑब्जेक्ट्स को एक बार अनलोड किया जाता है, उन्हें स्मृति में रखा जाता है और जब उन्हें अगली आवश्यकता होती है तब पुन: उपयोग किया जाता है। दूसरा, जहां अनलोड किए गए ऑब्जेक्ट्स को त्याग दिया जाता है, और बाद में बनाए गए नए। पहले मामले में, आपको "लोड" ईवेंट सुनना होगा। दूसरे मामले में, ऐसा करने से पुराने ऑब्जेक्ट्स को जीसीएड (मेमोरी लीक) होने से रोका जा सकता है, इसलिए आपको "लोडेड" ईवेंट से अलग होना चाहिए। – McGarnagle

उत्तर

2

@ जस्टिन एक्सएल के लिए एक बड़ा धन्यवाद, माइक्रोसॉफ्ट ने यूडब्ल्यूपी के लिए व्यवहारकर्ता एसडीके को अद्यतन किया है और इसे ओपन सोर्स बनाया है। नई पुस्तकालय नेविगेशन अलग समस्याओं को ठीक करते हैं! :)

http://blogs.windows.com/buildingapps/2015/11/30/xaml-behaviors-open-source-and-on-uwp/

https://twitter.com/hashtag/BehaviorsGoOpenSource?src=hash

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