以下のクラスは、一時的に出てヌルlateinit
性質nullにlateinit Kotlinプロパティを設定する方法
class SalesController : BaseController, SalesView {
@Inject lateinit var viewBinder: SalesController.ViewBinder
@Inject lateinit var renderer: SalesRenderer
@Inject lateinit var presenter: SalesPresenter
lateinit private var component: SalesScreenComponent
override var state = SalesScreen.State.INITIAL //only property that I want to survive config changes
fun onCreateView(): View { /** lateinit variables are set here */ }
fun onDestroyView() {
//lateinit variables need to be dereferences here, or we have a memory leak
renderer = null!! //here's the problem: throws exception bc it's a non-nullable property
} }ここで
は、それがフレームワークによって使われています方法私を必要とする非常にユニークなライフサイクルを持っています。
controller.onCreateView() //same instance of controller
controller.onDestroyView() //same instance of controller
controller.onCreateView() //same instance of controller
controller.onDestroyView() //same instance of controller
私lateinit
プロパティは短剣によって注入されている、と私はonDestroyView
にnull
にそれらを設定する必要があります - またはメモリリークを持っています。これは、私が知っている限り(反射なしで)、kotlinでは可能ではありません。私はこれらのプロパティをnullにすることができますが、それはKotlinのnull安全性の目的を無効にします。
私はこれを解決する方法はあまりよく分かりません。理想的には、onDestroyView
に特定の変数を自動的にヌルにするJavaコードを生成するアノテーションプロセッサがありますか?
なぜ漏れがありますか?おそらく、問題はSalesControllerのプロパティではなく、SalesControllerにありますか?私は、漏れの問題を避けるためにDaggerによって注入されたプロパティをnullに明示的に設定する必要はありませんでした。 – Massimo
@Massimo指揮者のコントローラインスタンスは設定の変更を生き残っていますhttps://github.com/bluelinelabs/Conductor – ZakTaccardi
それらを無効にする必要がある場合、あなたは 'lateinit'をする必要はありません。そして、私はそこにどんなリークもないと確信しています、あなたはちょうどいくつかの定義を混ぜています。プレゼンターがあなたのビューを参照する場合はリークしません。 – Dimezis