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 编程一样手动管理
所以基本上:
很可能没问题,但即使没有,您也无能为力,因为没有明确删除 JS objects
将被收集但不可见
将被收集(请记住 QtObject 不会公开任何 parent)
将被收集但也将可见,幸存的parent不会将其从删除中保存
如果我有一些对象、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 编程一样手动管理
所以基本上:
很可能没问题,但即使没有,您也无能为力,因为没有明确删除 JS objects
将被收集但不可见
将被收集(请记住 QtObject 不会公开任何 parent)
将被收集但也将可见,幸存的parent不会将其从删除中保存