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
Seite 1 von 2  1 2   
romber

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

Problem mit ARC unter iOS?

  Alt 21. Jan 2016, 16:25
Hallo!

Ich programmiere eine iOS-App unter Verwendung der D.P.F Delphi iOS Native Components. Ich habe eine TableView, die dynamisch mit Daten befüllt wird. Beim Markieren eines Items wechselt die App zu einer anderen dynamisch erzeugten View (Details View), auf die ich nach Bedarf mehrere danymisch erzeugte Controls setze. Beim wechseln zurück zur TableView sollen alle dynamisch erzeugte Controls wieder freigegeben werden. So wie sich meine App nach mehreren aufrufen der Details View verhält habe ich das Gefühl, dass die erzeugte Controls gar nicht freigegeben werden. Nach ca. 50-70 Aufrufen stürzt die App endgültig ab.

Gibt es eine verlässliche Methode, mit der man überprüfen kann, ob dynamisch erzeugte Controls auf einer dynamisch erzeugten View von ARC freigegeben werden?
  Mit Zitat antworten Zitat
Darlo

Registriert seit: 28. Jul 2008
Ort: München
1.196 Beiträge
 
Delphi 10.2 Tokyo Enterprise
 
#2

AW: Problem mit ARC unter iOS?

  Alt 21. Jan 2016, 16:42
Wie gibts Du die Controls denn frei? Du kannst mit den Instruments von xCode verfolgen was genau wann passiert (Memory).
Philip
  Mit Zitat antworten Zitat
romber

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

AW: Problem mit ARC unter iOS?

  Alt 21. Jan 2016, 17:00
Ich setze am Ende der Methode (in der die Controls alle deklariert und erstellt werden) alle Controls auf nil und gehe davon aus, dass ARC das Control bei der nächsten Gelegenheit wieder freigibt.
  Mit Zitat antworten Zitat
bra

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

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.163 Beiträge
 
Delphi 10 Seattle Professional
 
#5

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

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.163 Beiträge
 
Delphi 10 Seattle Professional
 
#7

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

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.163 Beiträge
 
Delphi 10 Seattle Professional
 
#9

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
romber

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

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
Antwort Antwort
Seite 1 von 2  1 2   

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 17:00 Uhr.
Powered by vBulletin® Copyright ©2000 - 2022, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2021 by Daniel R. Wolf