Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Cross-Platform-Entwicklung (https://www.delphipraxis.net/91-cross-platform-entwicklung/)
-   -   iOS ios App:Komponente freigeben. (https://www.delphipraxis.net/187182-ios-app-komponente-freigeben.html)

vit4l 4. Nov 2015 19:22

ios App:Komponente freigeben.
 
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?

Sir Rufo 4. Nov 2015 19:23

AW: ios App:Komponente freigeben.
 
siehe Delphi-Referenz durchsuchenTObject.DisposeOf

vit4l 4. Nov 2015 19:38

AW: ios App:Komponente freigeben.
 
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.

vit4l 4. Nov 2015 19:48

AW: ios App:Komponente freigeben.
 
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;

Sir Rufo 4. Nov 2015 21:41

AW: ios App:Komponente freigeben.
 
Hier gibt es einen dangling pointer.

Wenn du von aussen die
Delphi-Quellcode:
FDPFView
Instanz per
Delphi-Quellcode:
DisposeOf
entsorgst, dann sollte die
Delphi-Quellcode:
TDPFUIView
auch die Referenz auf
Delphi-Quellcode:
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
Delphi-Quellcode:
FDPFView
eine Delphi-Referenz durchsuchenTComponent.FreeNotification registrieren und wenn die dann kommt, die Instanz-Variable auf nil setzen.


Alle Zeitangaben in WEZ +1. Es ist jetzt 07:52 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz