HarmonyOS 关于内存管理?

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内打印了上一次的对象地址。

阅读 556
1 个回答
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
logo
HarmonyOS
子站问答
访问
宣传栏