Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Cross-Platform-Entwicklung (https://www.delphipraxis.net/91-cross-platform-entwicklung/)
-   -   Delphi Frage zu FMX & ARC? (https://www.delphipraxis.net/191944-frage-zu-fmx-arc.html)

Mavarik 6. Mär 2017 11:08


Frage zu FMX & ARC?
 
Hallo Zusammen!

Ich habe gerade eine tolle Fehlerquelle in meiner App (unter ARC) Windows - logischerweise - kein Problem...

Vielleicht habe ich ja "nur" ein Denkfehler... :stupid:

Ich habe in einer Form eine locale Variable "FWhatever : TMyClassFoo".

Diese Variable wird im Create erzeugt und erst im Destroy wieder frei gegeben... Kein anderer hat eine Referenz darauf.

Wenn ich jetzt von außen eine Message sende und in der Empfangsroutine (locale anonyme Procedure in der Form)
auf FWhatever zugreifen will ist FWhatever = NIL... Strange...

Ich habe jetzt probeweise die Variable in der Formunit als VAR (global) definiert. Das Form erzeugt und killt die Instance wie bisher...

Fehler weg...

Sonst ist keine "Magic" drum-rum, daher auch kein Codesnipit... Hat jemand ne Idee wo mein Denkfehler ist?

Grüsse

Mavarik :coder:

Sherlock 6. Mär 2017 11:10

AW: Fmx & arc
 
Closure? War da nicht was mit anonymen Methoden? Ich verstehe Closures nicht so ganz, aber ist das nicht ein (erwünschter) Nebeneffekt davon?

Sherlock

Mavarik 6. Mär 2017 11:15

AW: Fmx & arc
 
Zitat:

Zitat von Sherlock (Beitrag 1363309)
Closure? War da nicht was mit anonymen Methoden? Ich verstehe Closures nicht so ganz, aber ist das nicht ein (erwünschter) Nebeneffekt davon?

Sherlock

Ja, Eben?!?

Die anonyme Methode sollt (bleibt) solange im Speicher, bis keine Variable mehr die darin verwendet wird eine Reference hat... (Tut sie ja auch). Aber das Form sollte doch so lange es existiert die Variable halten... Nicht auf keinen Fall frei geben - oder verstehe ich das nicht?

Mavarik

TiGü 6. Mär 2017 12:34

AW: Frage zu FMX & ARC?
 
Existiert denn absolut gesichert die Form noch zum Zeitpunkt des Empfangs im Empfangs-Closure?
Vielleicht ist die Form auch durch ARC freigeben, weil die auf keinen Feld/Member-Variablen hängt.
Erstelle mal parallel ein FMyObject: TObject und prüfe, ob die Instanz hier auch nil ist.

Funktioniert es denn, wenn du aus der anonyme Procedure eine richtige Klassenmethode machst?

Mavarik 6. Mär 2017 12:49

AW: Frage zu FMX & ARC?
 
Zitat:

Zitat von TiGü (Beitrag 1363319)
Existiert denn absolut gesichert die Form noch zum Zeitpunkt des Empfangs im Empfangs-Closure?
Vielleicht ist die Form auch durch ARC freigeben, weil die auf keinen Feld/Member-Variablen hängt.
Erstelle mal parallel ein FMyObject: TObject und prüfe, ob die Instanz hier auch nil ist.

Funktioniert es denn, wenn du aus der anonyme Procedure eine richtige Klassenmethode machst?

OK! 2 gute Fragen/Ideen... Muss ich testen...

Mavarik

Stevie 6. Mär 2017 14:05

AW: Frage zu FMX & ARC?
 
Seh ich das richtig?
Closure im Form, die auf Feldvariable des Forms zugreift?

Riecht nach zirkulärer Refrenz durch implizites Capture von Self - siehe: https://quality.embarcadero.com/browse/RSP-10176

Wenn nun dein FormDestroy läuft und nicht die anonyme Methode explizit auf nil setzt, bleibt sie am Leben, <implites captured Self>.FWhatever zeigt aber nun auf nil.

Mavarik 6. Mär 2017 14:25

AW: Frage zu FMX & ARC?
 
Zitat:

Zitat von Stevie (Beitrag 1363334)
Seh ich das richtig?
Closure im Form, die auf Feldvariable des Forms zugreift?

Riecht nach zirkulärer Refrenz durch implizites Capture von Self - siehe: https://quality.embarcadero.com/browse/RSP-10176

Wenn nun dein FormDestroy läuft und nicht die anonyme Methode explizit auf nil setzt, bleibt sie am Leben, <implites captured Self>.FWhatever zeigt aber nun auf nil.

OK... Versteh ich...

Aber in FormDestory Unregistriere ich den MessageType also sollte der MessageHandler diese procedure nicht mehr aufrufen und bei einem neuen Create sollte dann doch eine neue Procedure im Speicher liegen und die Variable wieder initialisiert sein, oder? (Abgesehen vom Mem-Leak)

Mavarik

Stevie 6. Mär 2017 15:18

AW: Frage zu FMX & ARC?
 
Zitat:

Zitat von Mavarik (Beitrag 1363307)
Sonst ist keine "Magic" drum-rum, daher auch kein Codesnipit...

Wär wohl einfacher, den Code zu posten, als stundenlang hin und her zu raten


Alle Zeitangaben in WEZ +1. Es ist jetzt 23:26 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