2016-03-19 14 views
1

Wenn ich ein Objekt, Item oder QtObject als eine Eigenschaft eines QML-Elements (sagen wir Item als Container, aber ich interessiere mich auch für die Situation, wenn das enthaltende Objekt QtObject ist), wie ist das Speichermanagement erledigt?QML-Objekt Eigenschaft Speicherverwaltung

Denken Sie über diese folgenden Situationen:

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

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

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

Wird das Element enthält, das Elternteil sein? Wird die Erinnerung an das Eigentumsobjekt freigegeben, wenn der Elternteil zerstört wird? Ist das eigentlich keine gute Sache und kann zu Speicherlecks führen, wenn die Eigenschaften nicht gelöscht oder in Code freigegeben werden? Und so weiter. Irgendwelche Einsichten?

Auch wäre es von Vorteil sein, so etwas wie dies in einer solchen Situation zu tun:

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

ich manchmal die Notwendigkeit, Dinge zu tun, wie hier, und nicht nur das Objekt konfigurieren unter den Kindern Verzug, Eigenschaft eines Artikels. Wenn das umschließende Objekt QtObject ist, gibt es keine Kinder-Standardeigenschaft, aber der Speicher muss weiterhin verwaltet werden.

+0

https://youtu.be/77LH_I_Vx5E könnte für Dich von Interesse sein. –

+0

Danke. Um 12:45 scheint die Nachricht zu sein, dass Ints und Bools möglicherweise besser als Vars gespeichert werden. Ob einige andere Typen eher vars oder typenspezifisch sein sollten, wurde nicht angesprochen, aber es scheint, dass in der Zukunft Qt Quick Releases von 6 an alles von der V4-Engine verarbeitet werden, und var legt Sachen auf diese Seite. –

+0

17:35 Vor ein oder zwei Folien wurde besprochen, wie die GC- oder Elternbeziehung die Speicherbereinigung von dynamischen Objekten handhaben wird, aber jetzt schlägt er vor, immer die Funktion destroy() zu verwenden, scheint hier eine Diskrepanz zu bestehen. - Es sei denn, wenn er speziell für die Fälle gedacht war, in denen der visuelle Elternteil in der dynamischen Erstellung angegeben wurde, in diesem Fall würde ein unnötiges dynamisches Objekt nicht vor dem Elternteil gelöscht, ohne den Befehl destroy() aufzurufen. –

Antwort

3
property Item someItem: Item { ... } 

Der Artikel wird nicht vorsortiert, aber trotzdem gesammelt. Durch das explizite Festlegen eines übergeordneten Elements wird sichergestellt, dass es im jeweiligen übergeordneten Element sichtbar ist.

Denken Sie daran, dass Item::parent das visuelle Elternteil ist, nicht das eigentliche Elternteil. Selbst wenn Sie explizit ein übergeordnetes Objekt festlegen, das länger als das Property-Holder-Objekt überlebt, wird das Eigenschaftswertobjekt dennoch erfasst.

Dies liegt daran, dass das "logische" übergeordnete Objekt im Gegensatz zum visuellen übergeordneten Objekt, das null bleibt, auf das Objekt für den Objekthalter gesetzt wird.

Die Speicherverwaltung von QML ist automatisch und funktioniert für die meisten Teile wie erwartet.Zwei Dinge im Auge zu behalten:

  • der Speicher-Manager ist eher zurückhaltend Speicher freizugeben, bis es sehr notwendig zu tun, so
  • in einigen „weniger orthodox“ Anwendungsfällen ist es bekannt, zum Scheitern verurteilt zu sammeln bestimmte Objekte, oder was ist noch schlimmer - it is known to destroy objects that are still in use, obwohl die Dokumentation besagt, dass kein Objekt gesammelt wird, wenn es ein gültiges Elternteil oder aktive Verweise darauf hat, solche Fälle führen normalerweise zu Abstürzen sogar in der relativ "sicheren" qtquick Laufzeitumgebung, Meine persönliche Lösung für dieses seltene Problem besteht darin, den Objektbesitz auf CPP zu setzen, wodurch qmls Speicherverwaltung für dieses Objekt vollständig deaktiviert wird, was bedeutet, dass die Objektlebensdauer ma sein muss naged manuell wie in den alten Tagen der C-Programmierung

Also im Grunde:

  1. es ist höchstwahrscheinlich in Ordnung, aber auch wenn es nicht ist, gibt es nichts, was man dagegen tun kann, wie es ist keine explizite Löschung von JS Objekte

  2. wird gesammelt werden, aber nicht sichtbar sein wird gesammelt

  3. werden (denken Sie daran, aussetzen QtObject keine Eltern)

  4. wird gesammelt werden, sondern wird auch zu sehen sein, ein überlebender Elternteil wird es nicht vor dem Löschen speichern