面试题答案
一键面试Flutter垃圾回收机制
- 自动垃圾回收:Flutter基于Dart语言,采用自动垃圾回收(GC)机制。Dart使用分代垃圾回收算法,将对象分为新创建的对象(新生代)和存活了一段时间的对象(老生代)。新生代对象创建和回收频繁,采用复制算法,将存活对象复制到新空间;老生代对象存活时间长,采用标记 - 清除 - 整理算法,标记存活对象,清除未标记对象,整理内存碎片。
- 根对象:垃圾回收器从根对象开始遍历,根对象包括全局变量、活动栈中的变量等。所有从根对象可达的对象被视为存活对象,不可达的对象则被回收。
避免内存泄漏及优化内存使用措施
图片资源处理
- 按需加载:使用
Image.asset
或Image.network
加载图片时,根据实际显示需求加载合适分辨率的图片。例如,在列表中显示小图时,加载低分辨率版本,当用户点击查看大图时,再加载高分辨率图片。 - 缓存机制:利用
CachedNetworkImage
等插件缓存网络图片,避免重复下载相同图片。对于本地图片,也可在应用内自行实现简单的缓存逻辑,减少加载次数。 - 释放资源:当图片不再显示(如页面销毁)时,确保相关资源被释放。例如,在
StatefulWidget
的dispose
方法中释放与图片相关的资源,如取消未完成的图片加载任务。
Stream流处理
- 正确订阅和取消订阅:在订阅
Stream
时,务必在不需要数据时取消订阅。例如,在StatefulWidget
的initState
方法中订阅Stream
,在dispose
方法中调用StreamSubscription.cancel
取消订阅,防止内存泄漏。 - 避免内存累积:对于持续产生数据的
Stream
,如Stream.periodic
,合理控制数据生成频率,避免数据累积过多导致内存占用过高。可以根据应用需求调整生成周期,或在处理数据后及时释放不需要的中间数据。 - 使用
async
和await
:在处理Stream
数据时,使用async
和await
语法确保代码按顺序执行,避免因异步操作导致的资源管理混乱和潜在的内存泄漏。例如,在async
函数中使用await
等待Stream
数据处理完成后再进行下一步操作。