HarmonyOS的内存管理方式是通过引用计数来管理的吗?因为发现如下代码,某些场景会导SearchResultContent释放不掉。
/* 更新页面展示状态*/
@Builder
private layoutPageIfNeed() {
Column() {
if (this.vm.pageState == SearchPageDisplayState.Entry) {
SearchEntryContent({ root: this.vm, entry: this.vm.entry })
} else if (this.vm.pageState == SearchPageDisplayState.Think) {
SearchThinkContent({ vm: this.vm })
} else {
SearchResultContent({ vm: this.vm })
}
}.layoutWeight(1)
.transition(TransitionEffect.translate({
y: (this.vm.param.geometryId && this.vm.param.searchBarBottomOffsetY) ? this.vm.param.searchBarBottomOffsetY : 0
}))
}
自测发现某些场景下即使if不满足,对应的ui在内存中也没有释放掉,定位到SearchResultSubContent内的如下代码中打印this,会输出上一次创建的地址。
// 定义滚动事件
private setupScrollInteractive() {
if (this.config.adapter.target) {
this.config.adapter.target.scroll = param => {
console.log('tag' + this.config.adapter)
if (param.cardType == SearchInformationType.YICHE_VIDEO ||
param.cardType == SearchInformationType.YICHE_NUMBER_VIDEO ||
param.cardType == SearchInformationType.VIDEO_RECOMMEND) {
console.log('当前偏移量' + this.currentOffsetY + ' ==== ' + param.offsetY)
this.listScroller.scrollTo({
xOffset: 0,
yOffset: (param.offsetY ?? 0) + this.currentOffsetY,
animation: true
})
}
}
}
}
页面结构从父到子:根页面 -\> SearchResultContent -\> SearchResultSubContent。
现象:根页面中通过if已经释放掉了SearchResultContent,但是下次再创建SearchResultContent时,在SearchResultSubContent的callback内打印了上一次的对象地址。
HarmonyOS有自己的GC机制会自动处理,变量在内存中不使用后,一般不会立即释放,请参考如下对GC的介绍:https://developer.huawei.com/consumer/cn/doc/harmonyos-guides-V5/gc-introduction-V5
https://blog.csdn.net/HarmonyOSDev/article/details/125886382