目录

ComponentContentNotRelease

通过构造函数创建的ComponentContent对象,其底层使用了BuilderNode。使用完毕后,需及时调用dispose()释放对实体节点的引用,避免导致内存泄漏。

规则配置

// rules.json
{
  "rules": {
    "arkts": {
      "ResourceLeak": [
        {
          "ruleId": "ComponentContentNotRelease",
          "severity": "error",
          "skip": false
        }
      ]
    }
  }
}

正例

import { ComponentContent } from '@kit.ArkUI';
@Builder
function buildText() {
  Text('buildText')
}

/**
 * 正例:正确释放资源
 */
@Component
export struct TestRelease {
  private content: ComponentContent<Object> | null = null;
  aboutToAppear() {
    this.content = new ComponentContent<Object>(this.getUIContext(), wrapBuilder(buildText));
  }
  build() {
    Text('Hello TestRelease')
  }
  aboutToDisappear() {
    this.content?.dispose();
  }
}

反例

import { ComponentContent } from '@kit.ArkUI';
@Builder
function buildText() {
  Text('buildText')
}

/**
 * 反例:未释放资源
 */
@Component
export struct TestNotRelease {
  private content: ComponentContent<Object> | null = null;
  aboutToAppear() {
    this.content = new ComponentContent<Object>(this.getUIContext(), wrapBuilder(buildText)); // leak
  }
  build() {
    Text('Hello TestNotRelease')
  }
  aboutToDisappear() {
    console.log('Do nothing');
  }
}

Code Scanner代码检查规则的配置指导请参考1.6.3 代码检查工具(codescanner)