静态集合中存储函数对系统有何影响?

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 不会是gced。如果你引用重物(如Activity),它们也不会被gced,这将导致内存泄漏

Kotlin 建立在 java 之上,它的 lambda 也会创建对象,但某些情况除外(参见 this 和 this)。

【讨论】:

以上是关于静态集合中存储函数对系统有何影响?的主要内容,如果未能解决你的问题,请参考以下文章

信号与系统,系统函数的影响

比特币牛市对Filecoin有何影响?增加Filecoin项目投资潜在用户,将存量市场变成增量市场,挖矿更经济,承接竞争溢出!

Application.onTerminate函数不会被执行,有何影响

PBEKeySpec对iterationCount和keyLength参数有何影响?

电路中Re起何作用?它的大小对电路性能有何影响

复合索引的顺序在 MongoDB 性能方面有何影响?