รูปแบบเหตุการณ์ที่อ่อนแอและเหตุการณ์คลาสสิกใน MVVMCROSS (หรือ. NET Framework) มีจุดประสงค์ที่แตกต่างกันและมีการใช้งานที่แตกต่างกันโดยมีวัตถุประสงค์หลักเพื่อจัดการการรั่วไหลของหน่วยความจำและอายุการใช้งานของวัตถุ
กิจกรรมคลาสสิก
เหตุการณ์คลาสสิกใน. NET ขึ้นอยู่กับการอ้างอิงที่แข็งแกร่ง เมื่อวัตถุสมัครสมาชิกกับเหตุการณ์ของวัตถุอื่นการอ้างอิงที่แข็งแกร่งจะถูกสร้างขึ้นจากแหล่งเหตุการณ์ไปยังสมาชิก ซึ่งหมายความว่าตราบใดที่แหล่งข้อมูลมีการอ้างอิงถึงสมาชิกผู้สมัครสมาชิกจะไม่สามารถเก็บขยะได้แม้ว่าจะไม่จำเป็นหรืออ้างอิงอีกต่อไปในแอปพลิเคชัน สิ่งนี้สามารถนำไปสู่การรั่วไหลของหน่วยความจำหากสมาชิกไม่ได้ยกเลิกการสมัครสมาชิกอย่างชัดเจนจากเหตุการณ์เมื่อไม่จำเป็นต้องใช้อีกต่อไป
ใน MVVMCROSS เหตุการณ์คลาสสิกสามารถใช้สำหรับการสื่อสารระหว่าง ViewModels และมุมมอง แต่พวกเขาต้องการการจัดการอย่างระมัดระวังเพื่อหลีกเลี่ยงการรั่วไหลของหน่วยความจำ ตัวอย่างเช่นหาก ViewModel เปิดเผยเหตุการณ์และมุมมองที่สมัครสมาชิก ViewModel จะมีการอ้างอิงที่แข็งแกร่งในมุมมองป้องกันไม่ให้มันถูกเก็บรวบรวมจนกว่าการสมัครสมาชิกจะถูกลบออกอย่างชัดเจน
รูปแบบเหตุการณ์ที่อ่อนแอ
รูปแบบเหตุการณ์ที่อ่อนแอได้รับการออกแบบมาเพื่อป้องกันการรั่วไหลของหน่วยความจำโดยใช้การอ้างอิงที่อ่อนแอแทนที่จะเป็นคนที่แข็งแกร่ง เมื่อสมาชิกใช้รูปแบบเหตุการณ์ที่อ่อนแอเพื่อสมัครสมาชิกเหตุการณ์แหล่งเหตุการณ์จะมีการอ้างอิงที่อ่อนแอไปยังสมาชิก สิ่งนี้ช่วยให้ผู้สมัครสมาชิกเป็นขยะที่เก็บรวบรวมหากไม่ได้อ้างอิงที่อื่นในแอปพลิเคชันอีกต่อไปแม้ว่าจะไม่ได้ยกเลิกการสมัครสมาชิกอย่างชัดเจนจากเหตุการณ์
ใน MVVMCROSS การใช้เหตุการณ์ที่อ่อนแอสามารถช่วยรักษาสถาปัตยกรรมที่สะอาดโดยการทำให้มั่นใจว่า ViewModels ไม่ได้มีการอ้างอิงที่แข็งแกร่งในการดู สิ่งนี้มีความสำคัญอย่างยิ่งในแอปพลิเคชันมือถือที่การจัดการหน่วยความจำมีความสำคัญ MVVMCROSS ให้ส่วนขยายเช่น `beaksubscribe` เพื่ออำนวยความสะดวกในการใช้งานที่อ่อนแอทำให้นักพัฒนาสามารถสมัครรับเหตุการณ์โดยไม่ต้องสร้างการอ้างอิงที่แข็งแกร่งซึ่งอาจนำไปสู่การรั่วไหลของหน่วยความจำ
การใช้งานและผลประโยชน์
การใช้งานที่อ่อนแอมักเกี่ยวข้องกับการสร้างกลไกที่กำหนดเองเพื่อจัดการการสมัครสมาชิกโดยใช้วัตถุ `beakreference ' วิธีการนี้ทำให้มั่นใจได้ว่าสมาชิกสามารถเก็บขยะได้หากไม่จำเป็นต้องลดความเสี่ยงของการรั่วไหลของหน่วยความจำ อย่างไรก็ตามมันยังแนะนำความซับซ้อนเพิ่มเติมและค่าใช้จ่ายประสิทธิภาพเล็กน้อยเนื่องจากจำเป็นต้องตรวจสอบว่าสมาชิกยังมีชีวิตอยู่ก่อนที่จะเรียกตัวจัดการเหตุการณ์ของพวกเขา
ข้อเสียและข้อควรพิจารณา
ในขณะที่รูปแบบเหตุการณ์ที่อ่อนแอมีประโยชน์สำหรับการป้องกันการรั่วไหลของหน่วยความจำ แต่ก็มีข้อเสียบางอย่าง มันอาจซับซ้อนกว่าที่จะนำไปใช้มากกว่าเหตุการณ์คลาสสิกและมีความเสี่ยงของวัตถุ "ซอมบี้" ที่ไม่ได้ใช้งานอีกต่อไป แต่ยังไม่ได้รวบรวมขยะ หากมีการยกเหตุการณ์และมีการดำเนินการจัดการสมาชิกของซอมบี้มันสามารถนำไปสู่พฤติกรรมหรือข้อผิดพลาดที่ไม่คาดคิด
โดยสรุปรูปแบบเหตุการณ์ที่อ่อนแอใน MVVMCROSS แตกต่างจากเหตุการณ์คลาสสิกโดยใช้การอ้างอิงที่อ่อนแอเพื่อป้องกันการรั่วไหลของหน่วยความจำและอนุญาตให้สมาชิกเป็นขยะที่เก็บรวบรวมได้ง่ายขึ้น แม้ว่าจะมีประโยชน์อย่างมากในแง่ของการจัดการหน่วยความจำ แต่ก็ต้องมีการดำเนินการอย่างรอบคอบและการพิจารณาข้อเสียที่อาจเกิดขึ้น
การอ้างอิง:[1] https://stackoverflow.com/a/19379912
[2] http://stackoverflow.com/questions/30848118/capturing-the-onexit-event-in-wpf-with-mvvmcross/31784453
[3] https://www.reactiveui.net/vs/mvvmcross
[4] https://mustafacanyucel.com/blog/blog-22.html
[5] https://ladimolnar.com/2015/09/14/the-weak-event-pattern-is-dangerous/
[6] https://www.mvvmcross.com/mvvmcross-6.0.0-release/
[7] https://yanxiaodi.gitbook.io/xamarin-mvvmcross-handbook/using-mvvmcross-to-create-your-first-xamarin-app/navigation/responding-the-e-vents-from-dferent-controls-listview
[8] https://www.devleader.ca/2024/02/14/weak-events-in-c-how-to-avoid-nasty-memory-leaks
[9] https://learn.microsoft.com/en-us/dotnet/desktop/wpf/events/weak-event-patterns?view=netdesktop-9.0
[10] https://www.mvvmcross.com/documentation/fundamentals/navigation
[11] https://www.mvvmcross.com/documentation/fundamentals/viewmodel-lifecycle
[12] https://stackoverflow.com/questions/13788787/when-to-use-weak-eakents