Registriert seit: 12. Aug 2003
Ort: Soest
4.016 Beiträge
Delphi 10.1 Berlin Enterprise
|
AW: Dynamisches Array of TButton löschen (SetLength)!?
28. Jul 2014, 12: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.
Geändert von Stevie (28. Jul 2014 um 12:45 Uhr)
|