下面类有一个非常独特的生命周期,这需要我暂时空出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