如何在静态集合中存储函数会影响系统?

我是一名应用程序员。 我用Java写了几个Android应用程序,在React / Redux中写了SPA。 最近,我开始使用Kotlin进行Android开发,并进入了iOS世界(使用Swift)。

我对React的体验还是挺酷的。 我喜欢反应的概念。 我认为将这个概念应用到我的移动应用程序会很好。 我知道有一堆的Rx库,但不仅仅是gradle-cocoapods-sync-use它,我想找到自己的方式,很好的教育目的。 我无法抗拒。 所以,经过几个小时的研究,我想出了这个想法。

这是事情:

比方说,我从服务器获取一些JSON数组。 然后我解析并将其存储在一个静态类(或Kotlin中的对象 ),我称之为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. 如果Garbage Collecter收集UI对象(例如Fragment),那么如果该lambda回调函数添加到来自gc'd对象的onItemsChanged数组会发生什么?

  2. 你对这个想法有什么看法? 如果你是我,你会怎么做?

  3. 请不要说“只使用RxSomething”

谢谢!

在Java中, static字段不是垃圾收集。 所以,你的代码将工作。

然而,这是一个不好的做法。

如上所述,你的onItemsChanged不会被编辑。 如果你引用重对象(如Activity),它们也不会被引用,这会导致内存泄漏

Kotlin是建立在java之上的,它的lambda也创建了一些除了某些情况之外的对象(参见这个和这个 )。

iOS / Swift不使用垃圾收集器。 iOS使用ARC,这也是基于强大的引用的不同的内存管理模型。

只要你保持对一个对象的强有力的引用,它就不会被释放。

我不知道Kotlin,所以对我来说,遵循你的代码片段是有点困难的,但是维护一个闭包(lambdas)的数组没有问题。