Как функции хранения в статической коллекции будут влиять на систему?

Я программист. Я написал несколько приложений для Android на Java и SPA в React / Redux. Недавно я начал использовать Kotlin для разработки Android и вошел в iOS world w / Swift.

Мой опыт с Реатом был чем-то крутым. Мне понравилась концепция реактивности. И я подумал, что было бы неплохо применить эту концепцию к моим мобильным приложениям. Я знаю, что есть куча Rx-библиотек, а не просто gradle-cocoapods-sync-use it, я хотел найти свой собственный путь, ну для образовательной цели. Я не мог устоять перед этим. Итак, после нескольких часов исследований я придумал эту идею.

Вот что:

Допустим, я получаю от сервера некоторый массив json. затем я разбираю и сохраняю его в статическом классе (или объекте в Котлине ), и я называю его AppContext

И он имеет множество функций, а сами данные такие:

var onItemsChanged: MutableList<() -> Unit> = mutableListOf() var items: List<Data>? by Delegates.observable(null) { _: KProperty<*>, _:List<Data>?, _: List<Data>? -> for(callback in onItemsChanged) callback() } /* or didSet{} in Swift */ 

Затем в пользовательском интерфейсе, когда я хочу слушать событие изменения стоимости, я просто пишу

 AppContext.onItemsChanged.add { updateUI() } /* and of course UI references AppContext.items */ 

Это почти все, что я думал. Но я думаю, что есть некоторые из них.

Мой вопрос:

  1. Что, если сборщик мусора собирает объект пользовательского интерфейса (например, фрагмент), то что произойдет, если эта функция обратного вызова лямбда добавит массив onItemsChanged из объекта, который gc'd?

  2. И что вы думаете об этой идее? и что бы вы сделали, если бы вы были мной?

  3. Пожалуйста, не говорите: «Просто используйте RxSomething»

Благодаря!

Solutions Collecting From Web of "Как функции хранения в статической коллекции будут влиять на систему?"

В Java static поля не собираются с мусором. Таким образом, ваш код будет работать.

Однако это плохая практика.

Как указано выше, ваш onItemsChanged не будет onItemsChanged . Если вы ссылаетесь на тяжелые объекты (suce as Activity), они также не будут gc , что приведет к утечке памяти .

Котлин построен на java, и его лямбда также создает объект, кроме некоторых случаев (см. Это и это ).

iOS / Swift не использует сборщик мусора. iOS использует ARC, которая является другой моделью управления памятью, также основанной на сильных ссылках.

Пока вы поддерживаете сильную ссылку на объект, он не будет выпущен.

Я не знаю Kotlin, поэтому мне немного сложно следовать вашему фрагменту кода, но поддержка массива закрытий (lambdas) в порядке.