You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

NativeScript RadListView页面跳转后内存分配持续增长问题

iOS端RadListView页面跳转后TKListViewCellBackgroundView内存不释放修复方案

这个问题本质是Telerik UI for NativeScript的RadListView在iOS端的原生层引用残留bug:TKListView单元格关联的TKListViewCellBackgroundView对应CALayer,在页面销毁、列表实例被JS层回收时,没有同步断开原生图层树的持有关系,所以常规JS层内存泄漏检测工具扫不到异常,但每次进入页面都会新建一批图层对象,内存就会持续上涨。

以下是按落地优先级排序的可行修复方案:

方案1:页面离开时主动清理列表原生缓存(改造成本最低,优先验证)

在RadListView所在页面的onNavigatingFrom(离开页面触发的生命周期)回调里,主动清空列表缓存、断开原生引用,不要等系统自动回收:

import { isIOS } from '@nativescript/core';

onNavigatingFrom() {
  if (this.radListRef) { // 替换为你自己代码里的RadListView实例引用
    // 先清空数据源,切断单元格对业务数据的持有
    this.radListRef.items = [];
    this.radListRef.items = null;

    if (isIOS && this.radListRef.nativeViewProtected) {
      const nativeTKList = this.radListRef.nativeViewProtected;
      // 遍历当前已渲染的可见单元格,手动释放背景视图与图层
      nativeTKList.visibleCells?.forEach(cell => {
        cell.backgroundView = null;
        cell.selectedBackgroundView = null;
        cell.contentView.subviews.forEach(subView => subView.removeFromSuperview());
        cell.layer.sublayers = null;
      });
      // 触发列表重载清空复用队列
      nativeTKList.reloadData();
    }

    // 将列表从父视图移除,断开视图树引用
    this.radListRef.removeFromParent();
    this.radListRef = null;
  }
}
  • 额外注意:如果路由配置里开了页面缓存(pageCache),需要针对RadListView所在页面单独关闭缓存,避免页面实例被路由层持有无法销毁。

方案2:关闭iOS端单元格复用机制(适配自定义单元格逻辑复杂的场景)

如果列表的自定义单元格包含大量图片绘制、自定义CALayer逻辑,直接关闭iOS端的单元格复用,从根源避免复用队列持有单元格残留:

<!-- RadListView标签上添加iOS专属属性 -->
<RadListView
  ios:cellReuse="false"
  loadOnDemandMode="None"
  ios:preloadCells="false">
  <!-- 原有列表项模板保持不变 -->
</RadListView>
  • 属性说明:
    • ios:cellReuse="false":关闭单元格复用,单元格滑出视口后会直接销毁,不会进入复用队列残留
    • ios:preloadCells="false":关闭屏幕外单元格预渲染,避免提前创建无意义的图层对象
    • 该方案会轻微降低长列表滑动性能,适合列表长度不超过100条的场景

方案3:调整组件版本规避原生层已知bug

TKListViewCellBackgroundView内存残留是nativescript-ui-listview9.0.0~10.2.0版本的已知原生bug,可通过调整版本彻底规避:

  • 追求稳定性可降级到无该bug的旧版本:锁定组件版本为8.0.2
  • 想保留新特性可升级到官方修复版本:升级组件到10.3.0及以上版本
  • 版本调整后必须执行iOS平台清理命令再重新编译,避免旧编译缓存影响效果:
ns platform clean ios
ns run ios

效果验证方式

每次离开RadListView页面后,用Xcode Instruments的Allocations工具观察VM: TKListViewCellBackgroundView (CALayer)条目:如果内存值不再随页面进入次数持续累加,能回落至进入页面前的基线水平,说明回收逻辑生效。不要用JS层内存泄漏工具排查这类问题,残留发生在NativeScript运行时的原生层,JS层检测工具无法识别。


内容的提问来源于stack exchange,提问作者Bancha Setthanan

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.27 13:15:42