2017-11-02 4 views
-1

私は、アプリケーションプログラマです。私はJavaでいくつかのAndroidアプリを、React/ReduxではSPAを書いた。最近、私はAndroid開発用にKotlinを使い始め、Swiftと一緒にiOSワールドに入りました。静的コレクションに関数を格納すると、システムにどのように影響しますか?

リアクトとの私の経験はちょっとクールでした。私は反応性の概念が好きだった。そして、私はこのコンセプトを自分のモバイルアプリに適用するのがいいと思った。私は何とかうまく教育目的のために、自分の道を見つけたい、Rx librariesの束がある知っているが、むしろそれをGradleの-cocoapods同期-使用より。私はそれに抵抗することができませんでした。だから、数時間の研究の後、私はこの考えを思いついた。

するのは、私は、サーバーからいくつかのJSON配列を取得していましょう:

は、ここでのことです。 、UIに続い

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 */ 

:私は解析し、静的クラス(またはobject in Kotlin)に格納し、Iは

AppContextをそれを呼び出して、それが関数の配列、及びこのようなデータ自体を有しています価値交換イベントに耳を傾けたいときはいつでも書きます。

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

これは私が思っていたほとんどすべてのものです。しかし、私は考えるべきことがいくつかあると思います。

私の質問は:ガベージCollecterが、UIオブジェクト(たとえば断片)を収集

  1. 何場合にラムダコールバック関数がどのgc'dオブジェクトからonItemsChanged配列に追加した場合、次に何が起こるのだろうか?

  2. そして、あなたはこのアイデアについてどう思いますか?あなたが私の場合はどうしますか?

感謝を "ちょうどRxSomethingを使用し、" 言わないでください! Javaでは

+1

スウィフトについて話している場合、ガベージコレクタはありません。 – ColGraff

+0

KickstarterはKotlinとSwiftでアプリケーションをビルドし、反応性ライブラリを使用しています(どちらか分かりません)。両方のコードセットはオープンソースであるため、そのコードの内容を見ることができます。 –

答えて

1

staticフィールドがごみ収集されません。したがって、あなたのコードは動作します。

しかし、それは、悪いプラクティスです。

上記の発言として、あなたのonItemsChangedgc編ではありません。重いオブジェクトを参照すると(アクティビティとして表示される)、gcも表示されず、メモリリークが発生します。

KotlinはJavaに基づいて構築されており、ラムダもいくつかのケース(ただし、とthisを参照)を除いてオブジェクトを作成します。

1

iOS/Swiftはガベージコレクタを使用していません。 iOSではARCが使用されています。これは強力な参照に基づいた別のメモリ管理モデルです。

オブジェクトへの強い参照を維持している限り、オブジェクトは解放されません。

私はKotlinを知らないので、コードスニペットに従うのは少し難しいですが、クロージャ(lambdas)の配列を維持するのは問題ありません。

関連する問題