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 = 'BeforeDestruction' then // 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;