Einzelnen Beitrag anzeigen

Benutzerbild von Stevie
Stevie

Registriert seit: 12. Aug 2003
Ort: Soest
4.008 Beiträge
 
Delphi 10.1 Berlin Enterprise
 
#4

AW: Meine neuste ARC-Hölle

  Alt 7. Feb 2018, 16:51
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;
Stefan
“Simplicity, carried to the extreme, becomes elegance.” Jon Franklin

Delphi Sorcery - DSharp - Spring4D - TestInsight

Geändert von Stevie ( 7. Feb 2018 um 16:59 Uhr)
  Mit Zitat antworten Zitat