У MVVMcross, як і в інших рамках, вибір між використанням слабкої референції та сильним референцією має вирішальне значення для управління пам'яттю та запобігання витоку пам'яті. Ось детальне пояснення відмінностей та те, як вони застосовуються в контексті mvvmcross:
Сильні посилання
** Сильні посилання - це тип посилання за замовчуванням у більшості мов програмування, включаючи C#. Коли об'єкт сильно посилається, колектор сміття не може зібрати його, поки всі сильні посилання на об'єкт не будуть видалені. Це означає, що поки є щонайменше одне сильне посилання на об'єкт, він залишиться в пам'яті.
У MVVMCross сильні посилання можуть призвести до витоків пам'яті, якщо не керуватися належним чином. Наприклад, якщо ViewModel має сильне посилання на перегляд, а подання також має сильну посилання на ViewModel, створюється цикл утримання. Це заважає обом предметам зібрати сміття, навіть коли вони більше не потрібні.
Слабкі посилання
** Слабкі посилання, з іншого боку, дозволяють колекціонеру сміття зібрати згаданий об'єкт, якщо не існує сильних посилань. Це особливо корисно в сценаріях, коли ви хочете, щоб об’єкт зібрався зібрати сміття, якщо він більше не потрібно, але все одно хочете отримати доступ до нього, якщо воно буде доступним.
У MVVMCross заохочується використання слабких посилань, щоб уникнути циклів для зберігання між ViewModels та Views. Наприклад, замість того, щоб мати ViewModel сильно посилається на вигляд, ви можете використовувати слабку довідку або систему обміну повідомленнями для спілкування між ними. Це гарантує, що погляд може бути зібраним сміттям, коли його більше не потрібно, навіть якщо ViewModel все ще існує.
Практичний приклад у mvvmcross
Розглянемо сценарій, коли ViewModel повинен повідомити про перегляд, коли завантажуються деякі дані. Поширений підхід полягає у використанні події в ViewModel, на який підписується перегляд. Однак, якщо перегляд сильно підписується на цю подію, він створює сильну довідку від ViewModel назад до перегляду, що може запобігти зібраному сміття.
Щоб уникнути цього, MVVMCross пропонує такі методи, як `sempubscribe`, що дозволяє подачі слабко підписатися на події ViewModel. Таким чином, ViewModel не має сильного посилання на перегляд, запобігаючи витоком пам'яті.
Керівні принципи використання слабких посилань у mvvmcross
- Використовуйте слабкі посилання для поглядів: Коли ViewModel повинен взаємодіяти з метою, використовувати слабкі посилання або системи обміну повідомленнями, щоб уникнути циклів утримання.
- Уникайте сильних посилань на перегляди: Переконайтесь, що ViewModels не містить сильних посилань на перегляд, що дозволяє зібрати сміття, коли вони більше не потрібні.
- Використовуйте системи обміну повідомленнями: Подумайте про використання таких систем обміну повідомленнями, як `imvxMessenger 'Mvvmcross для спілкування між ViewModels та Views, не створюючи сильних посилань.
Дотримуючись цих вказівок, ви можете ефективно керувати пам'яттю в програмах 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/apraches-for-implementing-weak-references
[7] https://putridparrot.com/blog/weakreferences-in-net/
4