ใน MVVMCROSS เช่นเดียวกับในกรอบอื่น ๆ ตัวเลือกระหว่างการใช้ความอ่อนแอและการอ้างอิงที่แข็งแกร่งเป็นสิ่งสำคัญสำหรับการจัดการหน่วยความจำและป้องกันการรั่วไหลของหน่วยความจำ นี่คือคำอธิบายโดยละเอียดเกี่ยวกับความแตกต่างและวิธีที่พวกเขานำไปใช้ในบริบทของ MVVMcross:
การอ้างอิงที่แข็งแกร่ง
** การอ้างอิงที่แข็งแกร่งเป็นประเภทการอ้างอิงเริ่มต้นในภาษาการเขียนโปรแกรมส่วนใหญ่รวมถึง C# เมื่อวัตถุถูกอ้างอิงอย่างยิ่งตัวเก็บขยะไม่สามารถรวบรวมได้จนกว่าการอ้างอิงที่แข็งแกร่งทั้งหมดจะถูกลบออก ซึ่งหมายความว่าตราบใดที่มีการอ้างอิงที่แข็งแกร่งอย่างน้อยหนึ่งการอ้างอิงถึงวัตถุมันจะยังคงอยู่ในหน่วยความจำ
ใน MVVMCROSS การอ้างอิงที่แข็งแกร่งสามารถนำไปสู่การรั่วไหลของหน่วยความจำหากไม่ได้จัดการอย่างถูกต้อง ตัวอย่างเช่นหาก ViewModel มีการอ้างอิงที่แข็งแกร่งไปยังมุมมองและมุมมองยังมีการอ้างอิงที่แข็งแกร่งไปยัง ViewModel จะสร้างวัฏจักรการรักษาไว้ สิ่งนี้จะป้องกันไม่ให้วัตถุทั้งสองถูกเก็บรวบรวมแม้ว่าจะไม่ต้องการอีกต่อไป
การอ้างอิงที่อ่อนแอ
** การอ้างอิงที่อ่อนแอในทางกลับกันอนุญาตให้ตัวเก็บขยะเก็บรวบรวมวัตถุอ้างอิงหากไม่มีการอ้างอิงที่แข็งแกร่ง สิ่งนี้มีประโยชน์อย่างยิ่งในสถานการณ์ที่คุณต้องการอนุญาตให้วัตถุถูกเก็บรวบรวมหากไม่จำเป็นต้องใช้อีกต่อไป แต่ยังต้องการเข้าถึงหากมันเกิดขึ้น
ใน MVVMCROSS การใช้การอ้างอิงที่อ่อนแอจะได้รับการสนับสนุนเพื่อหลีกเลี่ยงการรักษาวัฏจักรระหว่าง ViewModels และมุมมอง ตัวอย่างเช่นแทนที่จะมี ViewModel อ้างอิงมุมมองอย่างยิ่งคุณสามารถใช้การอ้างอิงที่อ่อนแอหรือระบบการส่งข้อความเพื่อสื่อสารระหว่างพวกเขา สิ่งนี้ทำให้มั่นใจได้ว่ามุมมองสามารถเก็บขยะได้เมื่อไม่จำเป็นต้องใช้อีกต่อไปแม้ว่า ViewModel จะยังคงอยู่
ตัวอย่างการปฏิบัติใน mvvmcross
พิจารณาสถานการณ์ที่ ViewModel ต้องการแจ้งมุมมองเมื่อโหลดข้อมูลบางอย่าง วิธีการทั่วไปคือการใช้เหตุการณ์ใน ViewModel ที่มุมมองสมัครรับ อย่างไรก็ตามหากมุมมองที่สมัครเป็นสมาชิกอย่างมากกับเหตุการณ์นี้มันจะสร้างการอ้างอิงที่แข็งแกร่งจาก ViewModel กลับไปที่มุมมองซึ่งสามารถป้องกันไม่ให้มุมมองจากการรวบรวมขยะ
เพื่อหลีกเลี่ยงสิ่งนี้ MVVMCROSS ให้วิธีการเช่น `beaksubscribe` ซึ่งช่วยให้มุมมองสามารถสมัครรับเหตุการณ์ของ ViewModel ได้อย่างอ่อนแอ ด้วยวิธีนี้ ViewModel ไม่ได้อ้างอิงถึงมุมมองที่แข็งแกร่งป้องกันการรั่วไหลของหน่วยความจำ
แนวทางสำหรับการใช้การอ้างอิงที่อ่อนแอใน mvvmcross
- ใช้การอ้างอิงที่อ่อนแอสำหรับมุมมอง: เมื่อ ViewModel ต้องการโต้ตอบกับมุมมองให้ใช้การอ้างอิงที่อ่อนแอหรือระบบการส่งข้อความเพื่อหลีกเลี่ยงการรักษาวัฏจักร
- หลีกเลี่ยงการอ้างอิงถึงมุมมองที่แข็งแกร่ง: ตรวจสอบให้แน่ใจว่า ViewModels ไม่ได้มีการอ้างอิงที่แข็งแกร่งไปยังมุมมองเพื่อให้มุมมองที่เก็บรวบรวมเมื่อไม่จำเป็นต้องใช้อีกต่อไป
- ใช้ระบบการส่งข้อความ: พิจารณาใช้ระบบการส่งข้อความเช่น `imvxmessenger` ของ MVVMcross เพื่อสื่อสารระหว่าง ViewModels และมุมมองโดยไม่ต้องสร้างการอ้างอิงที่แข็งแกร่ง
โดยทำตามแนวทางเหล่านี้คุณสามารถจัดการหน่วยความจำได้อย่างมีประสิทธิภาพในแอปพลิเคชัน MVVMCROSS และป้องกันปัญหาทั่วไปเช่นการรั่วไหลของหน่วยความจำ
การอ้างอิง:[1] https://stackoverflow.com/a/19379912
[2] https://forums.swift.org/t/unowned-references-have-more-overhead-than-strong-references/72765
[3] https://learn.microsoft.com/en-us/dotnet/standard/garbage-collection/weak-references
[4] https://www.reddit.com/r/swift/comments/8ifwy9/ios_mvvm_breaking_retainer_cycle_between/
[5] https://stackoverflow.com/questions/40966271/weak-reference-and-strong-reference
[6] https://langdev.stackexchange.com/questions/1351/approaches-for-implementing-weak-references
[7] https://putridparrot.com/blog/weakreferences-in-net/
[8] http://java-latte.blogspot.com/2014/07/difference-between-strongreference-weakreference-softreference-phantomreference-in-java.html