Wenn ich deinen Code jetzt richtig deute - mir fehlen da ggf. noch ein paar Informationen zu den verwendeten Klasse - dann ist es so, dass du beim Hinzufügen der Elemente aus dem Array zur TObjectList<T> die TObjectList<T> zum Besitzer der Elemente machst. Durch das Hinzufügen wird nur ein Pointer auf das Objekt in die ObjectList eingefügt die zuvor auch im TArray verwendet wurde. Wenn die ObjectList mit OwnsObjects = True erzeugt wurde, was dem Standard entspricht, dann werden die Objekte auch entsprechend freigegeben.
Die Elemente werden nicht einer ObjectList, sondern ebenfalls einem Array hinzugefügt:
Delphi-Quellcode:
TPaging<TItem: class> = class
private
FItems: TArray<TItem>; // enthält die Track-Objekte; hierhin wird kopiert
FOffset: Integer;
FTotal: Integer;
FLimit: Integer;
FHref: string;
FNext: string;
FPrevious: string;
function ExpandItems(NewLength: Integer):Integer;
function AddItem(Item: TItem; var Position: Integer): Boolean;
Function GetTrackcount: Integer;
public
destructor Destroy; override;
property Href: string read FHref;
property Items: TArray<TItem> read FItems;
property Limit: Integer read FLimit;
property Next: string read FNext;
property Offset: Integer read FOffset;
property Previous: string read FPrevious;
property Total: Integer read FTotal;
property count: Integer read GetTrackCount;
end;
TPlayList = class
private
FName: string;
FTracks: TPaging<TPlaylistTrack>;
public
destructor Destroy; override;
property Name: string read FName;
property Tracks: TPaging<TPlaylistTrack> read FTracks;
end;
Bei ersten Versuchen hatte ich beim Freigeben von 'nextpage' auch die Elemente des Arrays entsorgt. Das hatte prompt zur Folge, dass die kopierten Zeiger im Playlist-Objekt ins Nirwana zeigten und Accessviolations erzeugten. In der aktuellen Version werden alle Items, auch die hinzugefügten, erst zusammen mit dem Playlist-Objekt freigegeben. Jedenfalls bleiben keine 'Speicherleichen' zurück (ReportMemoryLeaksOnShutdown = true)
Gruß LP