下面類有一個非常獨特的生命週期,這需要我暫時空出lateinit
性能如何設置lateinit科特林屬性設置爲null
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
屬性由匕首注入,我需要將它們設置爲null
在onDestroyView
- 或有內存泄漏。據我所知,這在kotlin中是不可能的(沒有反思)。我可以讓這些屬性可以爲空,但這會破壞Kotlin無效安全的目的。
我不太清楚如何解決這個問題。理想情況下,可能有某種類型的註釋處理器會生成java代碼,以便在onDestroyView
中自動清空特定變量?
爲什麼你有泄漏?也許問題出在SalesController而不是其屬性上?我從來沒有需要明確地設置爲null注入由Dagger注入的屬性,以避免泄漏問題... – Massimo
@Massimo Conductor的控制器實例在配置更改後仍然存在https://github.com/bluelinelabs/Conductor – ZakTaccardi
如果您需要取消它們,那麼你就不需要'lateinit'。我敢肯定你沒有任何泄漏,你只是混合了一些定義。如果您的演示者會引用您的視圖,那麼您會泄漏,反之亦然 – Dimezis