Einzelnen Beitrag anzeigen

Benutzerbild von Stevie
Stevie

Registriert seit: 12. Aug 2003
Ort: Soest
4.008 Beiträge
 
Delphi 10.1 Berlin Enterprise
 
#2

AW: Dynamisches Array of TButton löschen (SetLength)!?

  Alt 28. Jul 2014, 11:42
Erstmal nur nebenbei: man sollte nicht Destroy direkt aufrufen sondern Free

Dann zu dem Problem allgemein: unter iOS und Android benutzt der Compiler ARC.
Hättest du dort Free aufgerufen, würde unter NEXTGEN compilern zu einer Zuweisung auf nil kompiliert.

Normalerweise werden Objekte unter ARC über ihren RefCount gehandelt (so wie Interfaces). Allerdings beißt sich das ein bisschen mit dem TComponent Management über den Owner.
Deshalb muss man hier DisposeOf (das geht dann auch für nicht NEXTGEN, somit keine ifdefs notwendig) aufgerufen werden, was zwar den Destructor aufruft aber nicht den internen RefCount verändert.
Wenn du nämlich das Array leerst, wird dort auch entsprechender Code ausgeführt, der den RefCount der Instanzen herunter setzt.

Generell sollte man aber beachten, dass man das Verwalten von TComponent Objekten entweder selbst verwaltet oder über den Owner regeln lässt. Beim selbst verwalten, sollte man dann auch nil an den Konstruktor übergeben damit sich das nicht vermischt.

Ich kann es gerade nicht ausprobieren, aber wenn du nil übergibst, dann kannst du dir glaube ich auf Mobile die Schleife sparen, die die Instanzen freigibt und einfach das Array leeren, denn die Instanzen werden dann implizit über den auf 0 sinkenden RefCount freigegeben.
Stefan
“Simplicity, carried to the extreme, becomes elegance.” Jon Franklin

Delphi Sorcery - DSharp - Spring4D - TestInsight

Geändert von Stevie (28. Jul 2014 um 11:45 Uhr)
  Mit Zitat antworten Zitat