如何在静态集合中存储函数会影响系统?
我是一名应用程序员。 我用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 */
这几乎是我所想的。 但我认为有一些需要考虑。
我的问题是:
-
如果Garbage Collecter收集UI对象(例如Fragment),那么如果该lambda回调函数添加到来自gc'd对象的onItemsChanged数组会发生什么?
-
你对这个想法有什么看法? 如果你是我,你会怎么做?
-
请不要说“只使用RxSomething”
谢谢!
在Java中, static
字段不是垃圾收集。 所以,你的代码将工作。
然而,这是一个不好的做法。
如上所述,你的onItemsChanged
不会被编辑。 如果你引用重对象(如Activity),它们也不会被引用,这会导致内存泄漏 。
Kotlin是建立在java之上的,它的lambda也创建了一些除了某些情况之外的对象(参见这个和这个 )。
iOS / Swift不使用垃圾收集器。 iOS使用ARC,这也是基于强大的引用的不同的内存管理模型。
只要你保持对一个对象的强有力的引用,它就不会被释放。
我不知道Kotlin,所以对我来说,遵循你的代码片段是有点困难的,但是维护一个闭包(lambdas)的数组没有问题。