Zirkuläre Referenz - der Aufruf von FInvoke in der anonymen Methode in TFDKMessageHandler captured Self implizit und sorgt unter ARC somit für ein __ObjAddRef -> memory leak
Ist schon länger bekannt, dass anonyme Methoden unter ARC schnell mal Leaks erzeugen -
https://quality.embarcadero.com/browse/RSP-10176
Was wir in Spring4D typischerweise an solchen Stellen machen, ist folgendes:
Delphi-Quellcode:
constructor TFDKMessageHandler<TMSG>.Create(AInvoke: TMyMSGType);
{$IFDEF AUTOREFCOUNT}
var
capturedSelf: Pointer; // alternativ mit [unsafe] dann spart man sich den hardcast weiter unten, aber da gabs in früheren Versionen noch Probleme, daher stumpf mit Pointer
{$ENDIF}
begin
inherited Create;
FInvoke := AInvoke;
{$IFDEF AUTOREFCOUNT}
capturedSelf := Self;
{$ENDIF}
FID := TMessageManager.DefaultManager.SubscribeToMessage(TFDKMSGType<TMSG>,Procedure (Const Sender : TObject;Const M : TMessage)
begin
{$IFDEF AUTOREFCOUNT}with TFDKMessageHandler<TMSG>(capturedSelf) do{$ENDIF}
FInvoke(Sender,TMSG(TFDKMSGType<TMSG>(M).Value));
end);
end;