Einzelnen Beitrag anzeigen

Der schöne Günther

Registriert seit: 6. Mär 2013
6.159 Beiträge
 
Delphi 10 Seattle Enterprise
 
#2

AW: Call by value statt Call by reference

  Alt 20. Okt 2020, 09:24
Du machst dir das zu kompliziert. Du musst das, was du in dein JSON-Array reinsteckst nicht nachhalten um es irgendwann freizugeben. Das JSON-Array selbst muss alles, was in ihm drin steckt auch mit freigeben wenn es sich freigibt.

Das ist genauso wie bei einer TObjectList<T> im Vergleich zu einer TList<T>. Erstere gibt die in im enthaltenen Objekte auch mit frei.

Falls ich dein Problem nicht falsch verstanden habe bringt dich das Beispiel hier hoffentlich weiter:

Delphi-Quellcode:
program Project1;

{$APPTYPE CONSOLE}
{$R *.res}

uses System.SysUtils, System.JSON, System.Generics.Collections, Rest.Json;

type
   TPerson = class
      var name: String;
   end;

function createPersonList(): TList<TPerson>;
var
   newPerson: TPerson;
begin
   Result := TObjectList<TPerson>.Create({ownsObjects:}True);

   newPerson := TPerson.Create();
   newPerson.name := 'Jupp Schmitz';
   Result.Add(newPerson);

   newPerson := TPerson.Create();
   newPerson.name := 'Dagobert Duck';
   Result.Add(newPerson);
end;

procedure fillJsonArray(
   const jsonArray: TJSONArray;
   const persons: TList<TPerson>
);
var
   asJsonObject: TJsonObject;
   person: TPerson;
begin
   for person in persons do
      begin
         asJsonObject := Rest.Json.TJson.ObjectToJsonObject(person);
         jsonArray.Add(asJsonObject);
         // Das TJsonObject gehört nun zum JSON-Array. Wenn das JSON-Array
         // freigegeben wird, dann auch alles was in ihm drinsteckt
      end;
end;

procedure p();
var
   personList: TList<TPerson>;
   jsonArray: TJsonArray;
begin
   personList := nil;
   jsonArray := nil;

   try
      personList := createPersonList();
      jsonArray := TJsonArray.Create();
      fillJsonArray(jsonArray, personList);

      WriteLn( jsonArray.ToString() );
   finally
      jsonArray.Free();
      personList.Free();
   end;
end;

begin
   p();
   readln;
end.
  Mit Zitat antworten Zitat