静态集合中存储函数对系统有何影响?
Posted
技术标签:
【中文标题】静态集合中存储函数对系统有何影响?【英文标题】:How storing functions in static collection will affect the system? 【发布时间】:2017-11-02 03:05:50 【问题描述】:我是一名应用程序员。我用 Java 写了几个 android 应用程序,用 React/Redux 写了 SPA。最近,我开始使用 Kotlin 进行 Android 开发,并通过 Swift 进入了 ios 世界。
我对 React 的体验很酷。我喜欢反应性的概念。我认为将这个概念应用于我的移动应用程序会很好。我知道有很多Rx libraries,但不仅仅是 gradle-cocoapods-sync-use 它,我想找到自己的方式,以某种方式用于教育目的。我无法抗拒。所以,经过几个小时的研究,我想出了这个主意。
事情是这样的:
假设我正在从服务器获取一些 json 数组。然后我解析并将它存储在一个静态类(或object in 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 */
然后在UI中,每当我想监听值变化事件时,我就写
AppContext.onItemsChanged.add updateUI()
/* and of course UI references AppContext.items */
这几乎就是我所想的。但我认为有一些需要考虑。
我的问题是:
如果垃圾收集器收集 UI 对象(例如 Fragment),那么如果 lambda 回调函数从 gc'd 的对象添加到 onItemsChanged 数组会发生什么?
您如何看待这个想法?如果你是我,你会怎么做?
请不要说“只使用 RxSomething”
谢谢!
【问题讨论】:
如果你在谈论 Swift,那么没有垃圾收集器。 Kickstarter 使用 Kotlin 和 Swift 构建他们的应用程序,并使用响应式库(不知道是哪个)。这两套代码都是开源的,所以你可以看到他们做了什么。 【参考方案1】:iOS/Swift 不使用垃圾收集器。 iOS 使用 ARC,这是一种不同的内存管理模型,同样基于强引用。
只要你保持一个对象的强引用,它就不会被释放。
我不了解 Kotlin,所以我有点难以遵循您的代码 sn-p,但维护一组闭包 (lambdas) 很好。
【讨论】:
【参考方案2】:在 Java 中,static
字段不会被垃圾回收。因此,您的代码将起作用。
但是,这是一种不好的做法。
如上所述,您的onItemsChanged
不会是gc
ed。如果你引用重物(如Activity),它们也不会被gc
ed,这将导致内存泄漏。
Kotlin 建立在 java 之上,它的 lambda 也会创建对象,但某些情况除外(参见 this 和 this)。
【讨论】:
以上是关于静态集合中存储函数对系统有何影响?的主要内容,如果未能解决你的问题,请参考以下文章
比特币牛市对Filecoin有何影响?增加Filecoin项目投资潜在用户,将存量市场变成增量市场,挖矿更经济,承接竞争溢出!
Application.onTerminate函数不会被执行,有何影响