kotlin 构造函数参数丢失?

kotlin Constructor parameters are missing ?

我为Glide写了一个MaskShapeTransformation,所以我想在我的Transformation中传递一个drawable,并用原始位图绘制这个drawable来制作遮罩效果。

一开始,我传递了一个像这样的可绘制对象并带有一个 SoftReference 以避免内存泄漏。

class MaskShapeTransformation(drawable: Drawable): BitmapTransformation() {
       private val weakDrawable = SoftReference(drawable)
       .....
}

但是当我使用 weakDrawable.get()? 可绘制对象时,可绘制对象为空

我不知道为什么,但我尝试了一切直到我改变了我的构造函数,我只是将 val 添加到修改后的 drawable 中,像这样

class MaskShapeTransformation(val drawable: Drawable): BitmapTransformation() {
       private val weakDrawable = SoftReference(drawable)
       .....
}

神奇的事情发生了,weakDrawable.get()?工作得很好!

我很困惑,谁能告诉我这是为什么?

第一点:WeakReference 粗略地说,只要其他东西也使引用保持活动状态,就会保留引用。

第二点:Kotlin 构造函数语法意味着它们 非常 不同:

  • MaskShapeTransformation(drawable: Drawable)
  • MaskShapeTransformation(val drawable: Drawable)

第一个只是说你必须将 Drawable 传递给构造函数。第二个也这么说,但是 also 在 class 上创建一个字段并用传递的值初始化它。这意味着第二种形式为您提供了一个具有两个字段的对象:

  • drawable: 持有传入的drawable
  • weakDrawable: 弱引用环绕 drawable.

将它们放在一起,现在你有一个 class 对 Drawable 有强引用,这意味着弱引用也将保持活动状态。