Einzelnen Beitrag anzeigen

Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.184 Beiträge
 
Delphi 12 Athens
 
#8

AW: Verständnisfrage: TJSONObject create/free/destroy?

  Alt 26. Jul 2022, 15:45
Du kannst natürlich auch mit DebugDCUs kompilieren und dann einen Haltepunkt in TJSONObject.Destroy setzen und verfolgen wo/wann deine Objekte verschwinden und deine Variablen somit ungültig sind.

Teilweise könnte man auch mit [weak] arbeiten und seine Variable automatisch auf NIL setzen lassen, was aber nur bei aktivem ARC funktioniert (also leider nicht in Win32/Win64).
Delphi-Quellcode:
var
  [weak] J: TJSONObject;

oder z.B. sich anders ins Destroy reinhängen.
Delphi-Quellcode:
uses System.JSON, System.RTTI;

procedure TForm21.FormCreate(Sender: TObject);
var
  J: TJSONObject;
  VMI: TVirtualMethodInterceptor;
begin
  J := TJSONObject.Create;

  VMI := TVirtualMethodInterceptor.Create({TJSONObject} J.ClassType);
  VMI.Proxify(J);
  VMI.OnBefore := procedure(Instance: TObject; Method: TRttiMethod; const Args: TArray<TValue>; out DoInvoke: Boolean; out Result: TValue)
    begin
      if Method.Name = 'BeforeDestructionthen // eigentlich hötte ich "Destroy" genommen, aber will nicht ... erst BeforeDestruction und dann nur noch FreeInstance (aber eigentlich hätte es gehen müssen)
        Beep; << hier drauf einen Debugger-Haltepunkt
        // oder ShowMessage(Instance.ClassName);
        // oder ShowMessage(Instance.ClassName + ' ' + (Instance as TJSONAncestor).ToString); // Achtung, .ToString landet natürlich ebenfalls in VMI.OnBefore

      //DoInvoke := True; ist zwar OUT, aber eigentlich ist es VAR und bereits mit True initialisiert, also somit nicht unbedingt nötig
    end;

  //...

  J.Free; // selber oder z.B. irgendwo via Owned innerhalb eines anderen Objekts
end;
$2B or not $2B

Geändert von himitsu (26. Jul 2022 um 15:49 Uhr)
  Mit Zitat antworten Zitat