AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren

Problem mit ARC unter iOS?

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

Registriert seit: 20. Jan 2015
711 Beiträge
 
Delphi 10.2 Tokyo Enterprise
 
#1

AW: Problem mit ARC unter iOS?

  Alt 21. Jan 2016, 17:05
Wie Darlo schon geschrieben hat, lässt sich das am einfachsten mit Instruments verfolgen, da kann man sich u.a. die komplette Struktur der noch vorhandenen Objekte anzeigen lassen.

Ein Objekt auf nil zu setzen reicht bei ARC nicht unbedingt. Solange noch irgendwelche Verweise auf das Objekt vorhanden sind, wird es nicht freigegeben. Ich habe mir dazu auch zu Debugging-Zwecken eine eigene Routine erstellt:

Code:
procedure TryFree(const AUnitName: String; const AObj: TObject);
begin
  if not Assigned(AObj) then
    Exit;
{$IFDEF AUTOREFCOUNT}
  if AObj.RefCount > 1 then begin
    OutputDebugStrFmt('[[%s]] %s.RefCount=%d', [AUnitName, AObj.QualifiedClassName, AObj.RefCount]);
    AObj.DisposeOf;
  end;
{$ELSE}
  AObj.Free;
{$ENDIF AUTOREFCOUNT}
end;
Die ist ziemlich nützlich, auch um Leaks in den Delphi-Komponenten zu finden.
  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, 17:25
Ein Objekt auf nil zu setzen reicht bei ARC nicht unbedingt. Solange noch irgendwelche Verweise auf das Objekt vorhanden sind, wird es nicht freigegeben.
Das stimmt. Aber die Controls werden in meinem Fall in der Methode lokal deklariert und nur in dieser Methode benutzt. Neben Controls selber setze ich auch noch für jedes Control den Parent auf nil.

...Ich habe mir dazu auch zu Debugging-Zwecken eine eigene Routine erstellt
Vielen Dank dafür! Werde ich gleich ausprobieren!
  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
 
#3

AW: Problem mit ARC unter iOS?

  Alt 21. Jan 2016, 17:42
Man braucht keine Unterscheidung zu machen.

TObject.DisposeOf testet selber auf nil und ruft den Destructor auf (egal ob ARC oder nicht).

TObject.Free testet selber auf nil und ruft den Destructor auf (nur bei NICHT-ARC)

Will man also eine Komponente ins Jenseits befördern, nimmt man generell DisposeOf .
Genauso mit Streams und sonstigen Instanzen, die noch Ressourcen halten, die man jetzt gesichert freigeben möchte.

Für den Rest nimmt man Free oder FreeAndNil .
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 17:46 Uhr)
  Mit Zitat antworten Zitat
romber

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

AW: Problem mit ARC unter iOS?

  Alt 21. Jan 2016, 18:00
Will man also eine Komponente ins Jenseits befördern, nimmt man generell DisposeOf .
Werden dabei auch all die Komponenten freigegeben, die in jenseits zu befördernde Komponente als Owner referenzieren?
Was passiert, wenn auf dem mit DisposeOf gekillten Control andere Controls liegen, die es als Parent referenzieren?
  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
 
#5

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
 
#6

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.372 Beiträge
 
Delphi 12 Athens
 
#7

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
romber

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

AW: Problem mit ARC unter iOS?

  Alt 21. Jan 2016, 19:59
Code:
procedure TryFree(const AUnitName: String; const AObj: TObject);
begin
  if not Assigned(AObj) then
    Exit;
{$IFDEF AUTOREFCOUNT}
  if AObj.RefCount > 1 then begin
    OutputDebugStrFmt('[[%s]] %s.RefCount=%d', [AUnitName, AObj.QualifiedClassName, AObj.RefCount]);
    AObj.DisposeOf;
  end;
{$ELSE}
  AObj.Free;
{$ENDIF AUTOREFCOUNT}
end;
Wo kommt denn die OutputDebugStrFmt her? Kann nichts dazu finden.
  Mit Zitat antworten Zitat
bra

Registriert seit: 20. Jan 2015
711 Beiträge
 
Delphi 10.2 Tokyo Enterprise
 
#9

AW: Problem mit ARC unter iOS?

  Alt 22. Jan 2016, 08:59
[QUOTE=romber;1327772]
Wo kommt denn die OutputDebugStrFmt her? Kann nichts dazu finden.
Das ist eine eigene Routine von uns, die einfach nur eine Meldung ins iOS-Log ausgibt.
  Mit Zitat antworten Zitat
Antwort Antwort

Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

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 00:35 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