通过构造函数创建的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)