弱引用WeakReference想必不需要多說(shuō)官还,常用來(lái)解決內(nèi)存泄漏問(wèn)題芹橡。它的使用應(yīng)該說(shuō)還算簡(jiǎn)單,但和普通變量直接存取相比妻枕,還是有那么一點(diǎn)繁瑣的僻族,而kotlin的委托屬性主要就是解決setter和getter的粘驰,用它完全可以簡(jiǎn)化弱引用的使用屡谐。
下面直接放出自定義委托的代碼述么,如果對(duì)委托屬性不熟悉,請(qǐng)自行上網(wǎng)查找資料愕掏。
class Weak<T : Any>(initializer: () -> T?) {
var weakReference = WeakReference<T?>(initializer())
constructor():this({
null
})
operator fun getValue(thisRef: Any?, property: KProperty<*>): T? {
Log.d("Weak Delegate","-----------getValue")
return weakReference.get()
}
operator fun setValue(thisRef: Any?, property: KProperty<*>, value: T?) {
Log.d("Weak Delegate","-----------setValue")
weakReference = WeakReference(value)
}
}
代碼很少度秘,首先聲明了一個(gè)泛型T,而getValue的返回值和setValue的value參數(shù)為T(mén)?饵撑,也就是說(shuō)被委托的屬性必須是可為null的剑梳,這個(gè)也很合理,畢竟是使用了弱引用滑潘,一旦持有的對(duì)象被回收了垢乙,獲取到的自然就是null了,所以屬性必須可null语卤。剩下的代碼就很簡(jiǎn)單了追逮,類內(nèi)部持有一個(gè)弱引用對(duì)象,在類創(chuàng)建的時(shí)候把initializer方法的返回值作為初始值存入弱引用粹舵,getValue方法從弱引用取值钮孵,setValue方法給弱引用賦值,而如果你不想為屬性賦初值的話眼滤,可以使用無(wú)參構(gòu)造器巴席,其實(shí)就是給弱引用的初值為null了。
具體使用诅需,假設(shè)act是Activity類型的
//需要指定初始值的情況
//自動(dòng)推斷出泛型
var act by Weak{
context
}
//也可以指定泛型漾唉,一種是給屬性指定類型,必須為可null的
var act: Activity? by Weak {
context
}
//第二種是為Weak指定泛型堰塌,不可null的
var act by Weak<Activity> {
context
}
//不指定初始值的情況赵刑,此時(shí)必須指定泛型
var act:Activity? by Weak()
或者
var act by Weak<Activity>()
這樣對(duì)屬性賦值和取值時(shí)像普通屬性那樣就可以了,委托內(nèi)部已經(jīng)幫我們做好了弱引用蔫仙。
這篇文章其實(shí)很簡(jiǎn)單料睛,之所以還要發(fā)出來(lái)是因?yàn)槲野l(fā)現(xiàn)很多人對(duì)委托還只停留在用用lazy的階段,希望發(fā)出來(lái)能為不熟悉委托的人帶來(lái)一點(diǎn)幫助吧