繁体   English   中英

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时,没有子默认属性,但仍需要管理内存。

property Item someItem: Item { ... }

该项目不会成为父级,但仍将收集。 明确设置父级将确保它在相应的父级中可见。

请记住, Item::parent是可视父级,而不是实际的父级。 因此,即使您明确设置了比属性持有者对象存活时间更长的父级,仍然会收集属性值对象。

这是因为与保持为null的可视父对象不同,“逻辑”父对象将被设置为属性持有者对象。

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

  • 内存管理器非常不愿意释放内存,直到它变得非常必要
  • 在一些“不太正统”的用例中,已知无法收集某些对象,或者更糟糕的是 - 已知会破坏仍在使用的对象 ,即使文档声明如果有对象也不会被收集有效的父或活动引用,这种情况通常会导致崩溃,即使在相对“安全”的qtquick运行时环境中,我对这个罕见问题的个人解决方案是将对象所有权设置为CPP,从而完全禁用qml对该对象的内存管理,这意味着必须像C编程的旧时一样手动管理对象生存期

所以基本上:

  1. 它很可能没问题,但即使它没有,你也无能为力,因为没有明确删除JS对象

  2. 将被收集但不可见

  3. 将被收集(请记住QtObject不会暴露任何父级)

  4. 将被收集,但也将是可见的,幸存的父母将不会保存它从删除

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM