簡體   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