Home Arrow Icon Knowledge base Arrow Icon Global Arrow Icon كيف يضمن MVVMcross جمع القمامة للاشتراكات في الأحداث


كيف يضمن MVVMcross جمع القمامة للاشتراكات في الأحداث


يضمن MVVMCROSS جمع القمامة للاشتراكات في المقام الأول من خلال استخدام المراجع الضعيفة. إليك شرح مفصل لكيفية عمله:

نظرة عامة على MVVMcross Messenger

تم تصميم المكون الإضافي MVVMCROSS Messenger لتسهيل تجميع الأحداث بين المكونات. يسمح للمكونات بالتواصل عن طريق النشر والاشتراك في الرسائل. يستخدم Messenger مراجع ضعيفة للاشتراكات في الأحداث ، مما يساعد على منع تسرب الذاكرة من خلال السماح لمجمع القمامة بإزالة الكائنات التي لم تعد تمت الإشارة إليها.

المراجع الضعيفة في MVVMCROSS

عندما تقوم بالاشتراك في رسالة باستخدام MVVMcross Messenger ، يمكنك تحديد ما إذا كنت تريد استخدام مرجع ضعيف أو قوي. بشكل افتراضي ، يستخدم MVVMcross مراجع ضعيفة (`mvxreference.weak`) للاشتراكات. هذا يعني أن الرسول لا يحمل إشارة قوية إلى طريقة رد الاتصال ، مما يسمح لمجمع القمامة بإزالة الاشتراك إذا خرج الكائن المشترك عن النطاق.

الاشتراك وإلغاء الاشتراك

يمكن إدارة الاشتراكات باستخدام عدة طرق:
- الاشتراك: يتم تمرير الرسائل مباشرة على مؤشر ترابط النشر.
- ConscriboNMainThread: يتم تنظيم الرسائل إلى مؤشر ترابط واجهة المستخدم الرئيسية.
- ConscriptionThreadPoolThread: الرسائل قائمة في قائمة الانتظار لمعالجة تجمع مؤشرات الترابط.

تقوم كل طريقة اشتراك بإرجاع "MVXSubscriptionToken" ، والتي يمكن استخدامها لإلغاء الاشتراك من الرسالة. ومع ذلك ، إذا لم يتم تخزين الرمز المميز ، فقد يتم جمع القمامة على الفور.

آلية جمع القمامة

تعتمد آلية جمع القمامة في MVVMcross على "mvxsubscriptiontoken" التي يتم جمعها عندما تنفد من النطاق. إذا لم يتم تخزين رمز الاشتراك ، فسيكون مؤهلاً لجمع القمامة ، مما قد يؤدي إلى إلغاء استدعاء معالج الأحداث. يضمن هذا النهج عدم الاحتفاظ بالكائنات في الذاكرة دون داع بسبب اشتراكات الأحداث.

مراقبة حالة الاشتراك

يوفر MVVMCROSS أيضًا طرقًا لمراقبة حالة الاشتراك الحالية ، مثل "Hassubscriptionsfor" و "CountSubscriptionsfor". بالإضافة إلى ذلك ، ينشر Messenger رسائل MVXSubScriberChangemessage "كلما تمت إضافة الاشتراكات أو إزالتها أو انتهاء صلاحيتها ، مما يسمح للمكونات بتكييف سلوكها بناءً على حالة الاشتراك الحالية.

أفضل الممارسات لإدارة الذاكرة

لضمان جمع القمامة الفعالة ومنع تسرب الذاكرة:
- استخدم المراجع الضعيفة للاشتراكات الحدث كلما كان ذلك ممكنًا.
- تخزين رموز الاشتراك إذا كنت بحاجة إلى إدارة الاشتراكات بشكل صريح.
- قم بإلغاء الاشتراك من الأحداث عندما لم تعد هناك حاجة إليها ، خاصة إذا كانت تستخدم مراجع قوية.
- تجنب الحفاظ على إشارات قوية إلى الأشياء التي يجب جمعها ، مثل نماذج العرض أو المشاهدات.

من خلال اتباع هذه الممارسات والاستفادة من آلية الاشتراك الضعيفة في MVVMCross ، يمكن للمطورين المساعدة في ضمان عدم وجود اشتراكات الأحداث لا تمنع جمع الكائنات من جمع القمامة ، وبالتالي الحفاظ على إدارة الذاكرة الفعالة في تطبيقاتهم.

الاستشهادات:
[1] https://www.mvvmcross.com/documentation/plugins/messenger
[2] https://stackoverflow.com/questions/39315395/mvvmcross-best-way-to-aise-event-in-viewmodel
[3] https://stackoverflow.com/questions/12494804/helping-the-gcin-mono-droid-using-mvvmcross
[4]
[5] https://github.com/mvvmcross/mvvmcross/issues/2145
[6] https://livebook.manning.com/book/xamarin-in-action/b-using-mvvm-light-instead-of-mvvmcross/v-15/
[7] https://stackoverflow.com/questions/30798429/mvvmcross-android-viewmodel-never-garbage-
[8] https://www.mvvmcross.com/documentation/advanced/customizing-using-app-and-setup
[9] https://www.spicelogic.com/blog/net-event handler-memory-leak-16