AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren

ios App:Komponente freigeben.

Ein Thema von vit4l · begonnen am 4. Nov 2015 · letzter Beitrag vom 4. Nov 2015
Antwort Antwort
vit4l

Registriert seit: 10. Jun 2008
72 Beiträge
 
#1

ios App:Komponente freigeben.

  Alt 4. Nov 2015, 19:22
Guten Abend,
habe wieder mal ein Problem wo ich nicht weiterkomme. Möglicherweise hat einer von euch es schon lösen können. Ich entwickele zurzeit eine kleine App für iOS. In dieser App nutze ich die D.P.F. Delphi iOS Native Components. Auf meiner Form habe ich im GIU-Designer TDPFUIViewController abgelegt. Auf diesem befindet sich TDPFNavigationController mit ein paar TDPFNavigationControllerPages. Auf einer der Pages habe ich TDPFUITableView die an mein DataSource angeknüpft ist. Nach dem TableView mit Daten befüllt ist, ermögliche ich dem User auf einen der Items zu klicken um eine Detailansicht zu erhalten. Beim Klick wird eine vorhandene TDPFNavigationControllerPage (DetailPage) gepusht. Vor dem Pushen erstelle ich dynamisch eine TDPFUIView, die auf der DetailPage abgelegt wird. Zusätzlich werden ein paar andere Komponenten dynamisch erstellt und bekommen als Parent sowie als Owner die DetailPage angeeignet. Soweit so gut. Jetzt zu dem eigentlichen Problem. Beim Klick auf den Back-Button lande ich wieder auf der Page mit der TableView und es wird ein ViewDidUnload für die vorherige Page ausgelöst. In diesem Ereignis gebe ich TDPFUIView, das auf der DetailPage lag, frei. Es sollten logischerweise eigentlich alle anderen Komponenten, die Childs von dieser View waren auch freigegeben werden. Allerdings sind diese noch im Arbeitsspeicher vorhanden und nach mehreren Aufrufen der DetailPage stürzt die App ab. Was auch verständlich ist, da der Arbeitsspeicher ausgelastet ist.
Ich verstehe leider nicht wieso diese Komponenten nicht freigegeben werden. Hatte jemand von euch schon das Problem?
  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
 
#2

AW: ios App:Komponente freigeben.

  Alt 4. Nov 2015, 19:23
siehe Delphi-Referenz durchsuchenTObject.DisposeOf
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
vit4l

Registriert seit: 10. Jun 2008
72 Beiträge
 
#3

AW: ios App:Komponente freigeben.

  Alt 4. Nov 2015, 19:38
Hallo,

danke für die schnelle Antwort. Welches Object sollte mit DisposeOf freigegeben werden? Soll ich es Auf Parent anwenden oder einzelene Childs der Reihe nach? Wenn ich DetailPage.DisposeOf aufrufe stürzt die ganze App sofort ab.
  Mit Zitat antworten Zitat
vit4l

Registriert seit: 10. Jun 2008
72 Beiträge
 
#4

AW: ios App:Komponente freigeben.

  Alt 4. Nov 2015, 19:48
Bei DisposeOf wird ja die Prozedur Destroy aufgerufen in der Prozedur von Distroy wird dann noch mal DisposeOf aufgerufen. Das bringt vermutlich das ganze zum Absturz.

destructor TDPFUIView.Destroy;
begin
{$IFDEF IOS}
FDPFView.DisposeOf;
//FUIControl := nil;
{$ENDIF}
inherited;
end;
  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: ios App:Komponente freigeben.

  Alt 4. Nov 2015, 21:41
Hier gibt es einen dangling pointer.

Wenn du von aussen die FDPFView Instanz per DisposeOf entsorgst, dann sollte die TDPFUIView auch die Referenz auf FDPFView auf nil setzen.

Aber genau das macht man dort wohl nicht -> Fehler in der Umsetzung.

Ein erster Workaround könnte so aussehen (nach einem kurzen Überfliegen der Unit)
Delphi-Quellcode:
destructor TDPFUIView.Destroy;
begin
{$IFDEF IOS}
if Assigned( FDPFView ) and not FDPFView.Disposed then
  FDPFView.DisposeOf;
//FUIControl := nil;
{$ENDIF}
inherited;
end;
Eine richtige Lösung ist es nicht, da müsste man für die Instanz FDPFView eine Delphi-Referenz durchsuchenTComponent.FreeNotification registrieren und wenn die dann kommt, die Instanz-Variable auf nil setzen.
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 ( 4. Nov 2015 um 21:51 Uhr)
  Mit Zitat antworten Zitat
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 13:03 Uhr.
Powered by vBulletin® Copyright ©2000 - 2020, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2020 by Daniel R. Wolf