AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Problem mit ARC unter iOS?

Ein Thema von romber · begonnen am 21. Jan 2016 · letzter Beitrag vom 22. Jan 2016
Antwort Antwort
Benutzerbild von Sir Rufo
Sir Rufo

Registriert seit: 5. Jan 2005
Ort: Stadthagen
9.454 Beiträge
 
Delphi 10 Seattle Enterprise
 
#1

AW: Problem mit ARC unter iOS?

  Alt 21. Jan 2016, 18:46
Wird eine TComponent Instanz zerstört werden auch alle Components zerstört.
Wird eine TWinControl Instanz zerstört werden auch alle Children zerstört.
Wird eine TFmxObject Instanz zerstört werden auch alle Children zerstört.

TObject.DisposeOf zerstört ohne Wenn und Aber (ARC oder nicht).

Einfache und alte Regel ... nur das mit dem DisposeOf ist neu.
Kaum macht man's richtig - schon funktioniert's
Zertifikat: Sir Rufo (Fingerprint: ‎ea 0a 4c 14 0d b6 3a a4 c1 c5 b9 dc 90 9d f0 e9 de 13 da 60)

Geändert von Sir Rufo (21. Jan 2016 um 18:49 Uhr)
  Mit Zitat antworten Zitat
romber

Registriert seit: 15. Apr 2004
Ort: Köln
1.167 Beiträge
 
Delphi 10 Seattle Professional
 
#2

AW: Problem mit ARC unter iOS?

  Alt 21. Jan 2016, 20:53
Wird eine TComponent Instanz zerstört werden auch alle Components zerstört.
Wird eine TWinControl Instanz zerstört werden auch alle Children zerstört.
Wird eine TFmxObject Instanz zerstört werden auch alle Children zerstört.

TObject.DisposeOf zerstört ohne Wenn und Aber (ARC oder nicht).

Einfache und alte Regel ... nur das mit dem DisposeOf ist neu.
Bei mir führt DisposeOf zum Absturz der App. Und zwar prüfe ich zuerst, ob DetailsView bereits existiert und kille diese ggfs. mit DisposeOf. Danach erstelle ich die DetailsView wieder. Sobald ich Controls auf das neu erzeugte DetailsView setze, stürzt die App ab.
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.388 Beiträge
 
Delphi 12 Athens
 
#3

AW: Problem mit ARC unter iOS?

  Alt 21. Jan 2016, 23:42
Und was sagt der Debugger?
Also WO stürzt es denn ab?

Bei TComponents gibt es auch noch Verbindungen zwischen den Controls, welche Referenzen darstellen und somit die Komponenten am Leben erhalten.
Und wenn du dir wirklich nicht sicher bist, ob etwas freigegeben wird, dann bau z.B. eine MessageBox/Logging in den Destructor und fertig.

Und warum verdammt nochmal ist man auf diese bescheuerte Idee mit dem DisposeOf gekommen und hat nicht einfach auch im ARC mit Free das "wirklich" freigeben können?
Also das aus DisposeOf ins Free eingebaut.
Ein Therapeut entspricht 1024 Gigapeut.
  Mit Zitat antworten Zitat
Benutzerbild von Sir Rufo
Sir Rufo

Registriert seit: 5. Jan 2005
Ort: Stadthagen
9.454 Beiträge
 
Delphi 10 Seattle Enterprise
 
#4

AW: Problem mit ARC unter iOS?

  Alt 22. Jan 2016, 02:03
Delphi-Referenz durchsuchenTObject->Delphi-Referenz durchsuchenTPersistent->Delphi-Referenz durchsuchenTComponent->Delphi-Referenz durchsuchenTFmxObject->Delphi-Referenz durchsuchenTControl
Darum gelten für ein TControl die Regeln für TComponent und TFmxObject

Weil unter ARC die Uhren anders ticken braucht man eine andere Strategie was den Destructor angeht.
Der Destructor wird unter ARC automatisch aufgerufen, wenn der RefCount auf 0 geht (keiner will mehr mit der Instanz spielen).

Würde jetzt mit Free unter ARC auch der Destructor aufgerufen, dann würde dieser mindestens zweimal aufgerufen:
Delphi-Quellcode:
var
  foo: TFoo;

foo.Free; // Destructor wird aufgerufen (ohne ARC)
foo := nil; // Destructor wird aufgerufen (mit ARC)
Ist das auch jedem bewusst? Denn das wäre ein anderes Verhalten als man es gewohnt ist.

Darum gibt es die DisposeOf Methode, weil ich als Programmierer damit (hoffentlich) ganz bewusst den Doppelaufruf des Destructors akzeptiere.
Delphi-Quellcode:
var
  foo: TFoo;

foo.DisposeOf; // Destructor wird aufgerufen (immer)
foo := nil; // Destructor wird aufgerufen (ARC)
Im Destructor kann man noch den Status Delphi-Referenz durchsuchenTObject.Disposed abfragen um eine Aktion auch garantiert nur einmal auszuführen.
Delphi-Quellcode:
destructor TFoo.Destroy;
begin
  CloseHandle( FHandle );
  inherited;
end;
Wer sieht das Problem?

Unter ARC könnte ich damit ein Handle schliessen, was ich aber gar nicht schliessen möchte.

Der Destructor sollte so aussehen
Delphi-Quellcode:
destructor TFoo.Destroy;
begin
  if not Disposed then
  begin
    CloseHandle( FHandle );
  end;
  inherited;
end;
denn nur so wird das Freigeben des Handle auch nur einmal ausgeführt.

PS Die Beispiele in der Dokumentation von Emba beinhalten einen Fehler, denn die Eigenschaft Delphi-Referenz durchsuchenTObject.Disposed ist protected und kann von aussen gar nicht abgefragt werden
Kaum macht man's richtig - schon funktioniert's
Zertifikat: Sir Rufo (Fingerprint: ‎ea 0a 4c 14 0d b6 3a a4 c1 c5 b9 dc 90 9d f0 e9 de 13 da 60)

Geändert von Sir Rufo (22. Jan 2016 um 02:16 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.388 Beiträge
 
Delphi 12 Athens
 
#5

AW: Problem mit ARC unter iOS?

  Alt 22. Jan 2016, 09:07
Man hätte aber das "abweichende" Verhalten anders benennen können, anstatt das Standardverhalten zu ändern.
Von mir aus auch einen WirklichGenauJetztFreigeben-Parameter beim Free mit dran (Default False?)

Halbwegs abwärtskompatiblen Code kann man so schon lange vergessen und Crossplattform ist auch nicht grade einfach.
Ein Therapeut entspricht 1024 Gigapeut.
  Mit Zitat antworten Zitat
Benutzerbild von Sir Rufo
Sir Rufo

Registriert seit: 5. Jan 2005
Ort: Stadthagen
9.454 Beiträge
 
Delphi 10 Seattle Enterprise
 
#6

AW: Problem mit ARC unter iOS?

  Alt 22. Jan 2016, 09:22
Man hätte aber das "abweichende" Verhalten anders benennen können, anstatt das Standardverhalten zu ändern.
Von mir aus auch einen WirklichGenauJetztFreigeben-Parameter beim Free mit dran (Default False?)

Halbwegs abwärtskompatiblen Code kann man so schon lange vergessen und Crossplattform ist auch nicht grade einfach.
Was ist denn jetzt wirklich abweichend?

Mit Free wird der Destructor nur einmal durchlaufen. Da hat sich nichts geändert.

Was ist denn gefährlicher?
  • Ein Programm mit Speicherlecks
  • Ein Programm was auf einmal falsch arbeitet?
Ich bin da eher für die Speicherlecks.

Man muss sich vor Augen halten, was eine Methode denn wirklich macht/bedeutet, dann ist so ein Paradigmenwechsel auch nicht mehr so schwer.

Grundsätzlich wäre ich aber für die generelle Einführung von ARC auf jeder Plattform. Dieser Mischmasch bei einer Multiplattform Anwendung bringt einen eher um den Verstand.
Kaum macht man's richtig - schon funktioniert's
Zertifikat: Sir Rufo (Fingerprint: ‎ea 0a 4c 14 0d b6 3a a4 c1 c5 b9 dc 90 9d f0 e9 de 13 da 60)
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 21:38 Uhr.
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz