【发布时间】:2018-11-27 03:03:36
【问题描述】:
我让这个类表现得像一个单例(实例没有被保护以再次重新创建):
class FooInteractorFactory(private val someEvent: SomeEvent) {
companion object {
lateinit var fooFactory: FooInteractorFactory
fun initialize(someEvent: SomeEvent) {
fooFactory = FooInteractorFactory(someEvent)
}
}
fun createSomeObject(): SomeObject {
return SomeObject(someEvent)
}
}
这个“单例”正在这个类中初始化:
class FooImpl : SomeEvent {
init {
FooInteractorFactory.initialize(this)
}
...
}
FooImpl 正在生命周期函数 onCreate() 的 Activity 中实例化:
class MainActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
val foompl = FooImpl()
}
...
}
我的问题是FooInteractorFactory、SomeEvent 或SomeObject 其中一些会被泄露或不符合垃圾收集条件?
正如文档所说,
当且仅当垃圾收集器可以回收其定义的类加载器时,才能卸载类或接口。
这将是合格的,但是,我不确定。我只是添加到应用程序 LeakCanary,但是,泄漏从未发生过。
我想根据你们每个人的经验来确定。
编辑
这是 FooInteractorFactory 在反编译的 java 代码中的样子:
public final class FooInteractorFactory {
private final SomeEvent someEvent;
@NotNull
public static FooInteractorFactory fooFactory;
@NotNull
public final FooInteractorFactory createSomeObject() {
return new SomeObject(this.someEvent);
}
public FooInteractorFactory(@NotNull SomeEvent someEvent) {
this.someEvent = someEvent;
}
public static final class Companion {
@NotNull
public final FooInteractorFactory getFooFactory() {
return FooInteractorFactory.access$getFooFactory$cp();
}
public final void setFooFactory(@NotNull FooInteractorFactory var1) {
FooInteractorFactory.fooFactory = var1;
}
public final void initialize(@NotNull SomeEvent someEvent) {
((FooInteractorFactory.Companion)this).setFooFactory(new FooInteractorFactory(someEvent));
}
}
}
FooInteractorFactory 是同一个类的静态引用。
【问题讨论】:
标签: android performance kotlin garbage-collection