1.虽然JVM 有GC,会帮助我们回收对象。但是有时候需要我们手动回收对象,特别Android,处理内存泄漏等问题。
//一般手动处理
class MainActivity : AppCompatActivity() {var data: Any? = nulloverride fun onCreate(savedInstanceState: Bundle?) {Create(savedInstanceState)setContentView(R.layout.activity_main)data = ...}override fun onDestroy() {Destroy()//页面销毁了,手动把变量设置为null,断开对象的引用data = null}
}
// Activity::kt
class DemoActivity: AppCompatActivity(R.layout.activity_demo) {// val 修饰 不可变, 只能初始化赋值private val name by autoCleans("xiaoli")//同上,区别在于,可以做一些自定义的操作private val name2 by autoCleans { name.uppercase()"Jack"}// var 修饰 初始化之后还可以做修改private var address by autoCleans("地址1")override fun onCreate(savedInstanceState: Bundle?) {Create(String()address = "新地址"}
}
/*** 扩展LifecycleOwner,对创建的对象,进行自动释放内存* 主要是对,Activity 和 Fragment、以及AppDelegate进行扩展* ReadWriteProperty 可读可写,* 使用的时候 修饰符用val 那么代表只读属性* 修饰符用var,那么代表属性可读可写。* 如果强制只读的话,那么可以 实现 ReadOnlyProperty接口,该接口只有getValue方法* 懒加载模式*/
inline fun <reified T : Any> LifecycleOwner.autoCleans(noinline objectFactory: ()-> T) :ReadWriteProperty<LifecycleOwner, T> = object :ReadWriteProperty<LifecycleOwner, T> {private var objects: T? = nullinit {lifecycle.addObserver(object : DefaultLifecycleObserver {override fun onDestroy(owner: LifecycleOwner) {Destroy(owner)//TODO 如果集合类型,应该先cleanobjects = veObserver(this)}})}override fun setValue(thisRef: LifecycleOwner, property: KProperty<*>, value: T) {objects = value}override fun getValue(thisRef: LifecycleOwner, property: KProperty<*>): T {objects?.let { return it }objects = objectFactory()return objects!!}// 对象销毁,会回调这个方法protected fun finalize() {}
}/*** 扩展LifecycleOwner,对创建的对象,进行自动释放内存*/
inline fun <reified T : Any> LifecycleOwner.autoCleans(obj: T): ReadWriteProperty<LifecycleOwner, T> = autoCleans { obj }
本文发布于:2024-01-31 04:54:33,感谢您对本站的认可!
本文链接:https://www.4u4v.net/it/170664807625673.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
留言与评论(共有 0 条评论) |