QML对象属性内存管理

QML object property memory management

如果我有一些对象、Item 或 QtObject 作为 QML 元素的 属性(假设 Item 作为容器,但我也对这种情况感兴趣,当包含对象是 QtObject 时),内存管理是怎么做的?

考虑以下这些情况:

1:    property var someObject: { "key" : "value" }

2:    property Item someItem: Item { ... }

3:    property QtObject someQtObject: QtObject { ... }

包含元素会是父元素吗?当父对象被销毁时,属性 对象的内存会被释放吗?这实际上不是一件好事,并且可能导致内存泄漏,除非在代码中删除或释放属性?等等。有什么见解吗?

此外,在这种情况下做这样的事情是否有益:

4:    property Item someItem: Item {
           parent: containingElementId
           ...
      }

有时我需要做像这里这样的事情,而不是简单地将对象配置为在项目的子项默认 属性 下。另外,当包含对象为QtObject时,默认没有children属性,但是内存还是需要管理的

property Item someItem: Item { ... }

该项目不会被 parent 编辑,但仍会被收集。明确设置 parent 将确保它在相应的 parent.

中可见

请记住,Item::parent 是视觉上的 parent,而不是实际的 parent。因此,即使您明确设置比 属性 持有者 object 存活时间更长的 parent,属性 值 object 仍将被收集。

这是因为与保持空的视觉 parent 不同,"logical" parent object 将设置为 属性 持有者 object.

QML 的内存管理是自动的,并且大多数部分都按预期工作。要记住两件事:

  • 内存管理器在变得非常需要释放内存之前不太愿意释放内存
  • 在某些 "less orthodox" 用例中,已知无法收集某些 object,或者更糟糕的是 - it is known to destroy objects that are still in use,即使文档说明没有 [=52] =] 如果它有一个有效的 parent 或对它的活动引用,这种情况通常会导致崩溃,即使在相对 "safe" 的 qtquick 运行环境中,我个人对这个罕见问题的解决方案是设置object CPP 的所有权,从而完全禁用 qml 的内存管理 object,这意味着 object 生命周期必须像过去的 C 编程一样手动管理

所以基本上:

  1. 很可能没问题,但即使没有,您也无能为力,因为没有明确删除 JS objects

  2. 将被收集但不可见

  3. 将被收集(请记住 QtObject 不会公开任何 parent)

  4. 将被收集但也将可见,幸存的parent不会将其从删除中保存