![]() |
ARC-sichere Zuweisung von self an Interface-Variable
Liebes Forum,
ich möchte die self-Referenz einer Interface-Variable zuordnen, ohne das automatic reference counting durcheinander zu bringen, bisher ohne Erfolg. Hier der Code (Sinnhaftigkeit ist erstmal egal):
Delphi-Quellcode:
type
IRequest = interface(IInterface) ['{AA14B3B9-9874-4E25-80BC-3C5A9A301ABC}'] function get(): Extended; end; TRequest = class(TInterfacedObject, IRequest) strict private var requestValue: IRequest; public function get(): Extended; constructor create(); end; TForm1 = class(TForm) procedure FormCreate(Sender: TObject); private { Private-Deklarationen } public { Public-Deklarationen } end; var Form1: TForm1; implementation {$R *.dfm} { TRequest } constructor TRequest.create; begin inherited create(); // bei allen 3 Varianten gibts nen Memory Leak self.requestValue := Self; // self.requestValue := Self as IRequest; // self.requestValue := IRequest(self); end; function TRequest.get: Extended; begin result := 0; end; procedure TForm1.FormCreate(Sender: TObject); var lReq: IRequest; begin lReq := TRequest.create; end; |
AW: ARC-sichere Zuweisung von self an Interface-Variable
Sinn oder Unsinn mal dahingestellt, in dem Moment an dem Du einer internen Interface Variable self zuweist, wird der Referenz count dieser Variable erhöht. Wenn Du also von aussen per interface auf diese klasse zugreifst hat die mindestens einen referenzcount von 2. Du musst also um dieses Objekt freizugeben irgendeine Möglichkeit einbauen den Refernzcount wieder zu verringern.
Aber ohne den "Sinn" dieser Aktion zu kennen sehe ich keinen "Sinn" darin, darauf tiefer einzugehen. Das Konstrukt in deinem Ausgangsposting mach halt keinen ......... |
AW: ARC-sichere Zuweisung von self an Interface-Variable
Vielleicht bringt es etwas, wenn du requestValue als weak kennzeichnest?
Delphi-Quellcode:
Ob das Sinn macht, sei mal dahingestellt ;)
var
[weak] requestValue: IRequest; |
AW: ARC-sichere Zuweisung von self an Interface-Variable
Zitat:
|
AW: ARC-sichere Zuweisung von self an Interface-Variable
Erstmal vielen Dank für eure Beiträge!
Es scheint wirklich an der Deklaration von requestValue: IRequest in TRequest zu liegen. Deklariere ich sie in einer anderen Klasse geht es (Code siehe unten). Ja, Sinn macht das so nicht. Hatte ich nur als Minimalbsp gewählt. Ich poste gleich mal die ausführlichere Version, dann wird es entweder klarer, oder ihr findet ne elegantere andere Lösung ;) [weak] kann ich nicht benutzen, da ich Turbo Delphi verwende (hab ich jetzt auch in mein Profil mal eingetragen...).
Delphi-Quellcode:
type
IRequest = interface(IInterface) ['{AA14B3B9-9874-4E25-80BC-3C5A9A301ABC}'] function get(): Extended; end; TRequestController = class(TObject) var requestValue: IRequest; end; TRequest = class(TInterfacedObject, IRequest) public function get(): Extended; constructor create( aRequestController: TRequestController ); end; TForm1 = class(TForm) procedure FormCreate(Sender: TObject); private { Private-Deklarationen } public { Public-Deklarationen } end; var Form1: TForm1; implementation {$R *.dfm} { TRequest } constructor TRequest.create( aRequestController: TRequestController ); begin inherited create(); aRequestController.requestValue := Self; end; function TRequest.get: Extended; begin result := 0; end; procedure TForm1.FormCreate(Sender: TObject); var lReq: IRequest; lReqCon: TRequestController; begin lReqCon := TRequestController.Create(); lReq := TRequest.create(lReqCon); lReqCon.Free; end; |
AW: ARC-sichere Zuweisung von self an Interface-Variable
Das letzte Beispiel sollte eigentlich ohne memoryleak funktionieren, oder?
Wenn Da doch eines ist, (Turbo Delphi ist zu lange her) erzeuge einen Destructor in TRequestController der die referenz explicit auf Nil setzte also etwa:
Delphi-Quellcode:
TRequestController.Destroy;
begin requestValue := nil; inherited; end; |
AW: ARC-sichere Zuweisung von self an Interface-Variable
Zitat:
|
AW: ARC-sichere Zuweisung von self an Interface-Variable
Dann ist ja alles gut.... (Hoffe ich)
|
AW: ARC-sichere Zuweisung von self an Interface-Variable
Turbo Delphi und ARC passt aber nicht so richtig zusammen?
Und da du damit eh nur Windows-Programme erstellen kannst, ist es dem auch egal, daßß er es nicht versteht. Das ihm "unbekannte" Attribut
Delphi-Quellcode:
sollt er sehen und dann stillschweigend ignorieren.
[Weak]
Und wenn er es nicht macht, dann definiert man eben ein WeakAttribute, für solch alte Delphis. In Bezug auf ganz neue Delphis kommt da aber noch was hinzu, denn inzwischen wird [Weak] endlich auch im Non-ARC-Umfeld beachtet, also vorallem natürlich für Interfaces. |
AW: ARC-sichere Zuweisung von self an Interface-Variable
Blöde Frage könnte das überhaupt schon mit Attributen umgehen? Ich glaube eher an einen Compilierfehler.Aber ist zu lange her.
|
AW: ARC-sichere Zuweisung von self an Interface-Variable
Kurzer Einschub: die ausführliche Version muss ich leider auf morgen früh verschieben.
Zitat:
|
AW: ARC-sichere Zuweisung von self an Interface-Variable
Upps, stimmt ... Attribute gibt es wohl erst seit Delphi 2010 (maximal inofiziell schon in 2009, aber nicht ausprobiert).
Dann bleiben da wohl nur ein paar {$IF} oder {$IFDEF} übrig, die da drumrum müssten. Turbo Delphi kennt nur Win32 und das ausgestorbene .NET (ich glaub mehr als 32 Bit oder gar andere Plattformen gab es erst ab XE2) Wie soll da ARC (Android/iOS) das Turbo Delphi überhaupt interessieren? Oder geht es hier nicht um ARC (Automatic Reference Counting) wie in Xcode oder vom Delphi in Android verwendet, sondern "nur" um die Referenzzählung von Interfaces? |
AW: ARC-sichere Zuweisung von self an Interface-Variable
Könnte langsam OT werden,
habe gerade mal eine VM mit Delphi 2007 hochgefahren.... Also Attribute kannte das nicht. Welche Basis hatte den Turbo Delphi? Ich weis es echt nicht mehr. Aber die Geschwindigkeit in der Delphi 2007 gestartet hat, klasse :-) |
AW: ARC-sichere Zuweisung von self an Interface-Variable
Turbo Delphi = Delphi 2006 (erste Version) und 2007 (zweite Version) ... danach war es
![]() |
Alle Zeitangaben in WEZ +1. Es ist jetzt 00:29 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz