![]() |
ARC - Weak-Referenzen mit unterschiedlichem Verhalten bei ARC und Nicht-ARC
Ist irgendjemandem bewusst gewesen, dass dieses Konstrukt sich auf ARC und Nicht-ARC anders verhält
Delphi-Quellcode:
Unter Nicht-ARC erhält man die Ausgabe
type
TForm1 = class( TForm ) Button1: TButton; Label1: TLabel; Button2: TButton; procedure Button1Click( Sender: TObject ); private FRealInstance: TObject; [weak] FWeakInstance: TObject; public end; var Form1: TForm1; implementation {$R *.fmx} procedure TForm1.Button1Click( Sender: TObject ); begin if Assigned( FRealInstance ) then FreeAndNil( FRealInstance ) else begin FRealInstance := TObject.Create; FWeakInstance := FRealInstance; end; Label1.Text := Format( {} 'RealInstance %x' + sLineBreak + {} 'WeakInstance1 %x', {} [ {0} NativeUInt( FRealInstance ), {1} NativeUInt( FWeakInstance )] ); end;
Code:
Unter ARC erhält man im Gegensatz dazu folgendes
1. Klick
RealInstance XXXXXXX WeakInstance XXXXXXX 2. Klick RealInstance 0 WeakInstance XXXXXXX
Code:
Da wird also der Wert der Weak-Referenz auf
1. Klick
RealInstance XXXXXXX WeakInstance XXXXXXX 2. Klick RealInstance 0 WeakInstance 0
Delphi-Quellcode:
gesetzt, wenn die Instanz aus dem Speicher fliegt.
nil
Finde ich ja grundsätzlich nicht schlecht, erschwert aber das Programmieren für beide Plattformen ... wäre ja schön gewesen, wenn da beide gleich reagieren würden (gerne mit dem automatischen Setzen auf
Delphi-Quellcode:
:stupid:)
nil
|
AW: ARC - Weak-Referenzen mit unterschiedlichem Verhalten bei ARC und Nicht-ARC
Dass ARC Weak-Referenzen auf NIL setzt, sobald das referenzierte Objekt zerstört wird, ist meines Wissens sogar dokumentiert.
Weak-Pointer kennen nur zwei Zustände: Gültige Referenz und NIL. |
AW: ARC - Weak-Referenzen mit unterschiedlichem Verhalten bei ARC und Nicht-ARC
Zitat:
|
AW: ARC - Weak-Referenzen mit unterschiedlichem Verhalten bei ARC und Nicht-ARC
Der blöde Compiler gibt dir nichtmal eine Warnmeldung, wenn er das
Delphi-Quellcode:
einfach mal so ignoriert. :wall:
[Weak]
Delphi-Quellcode:
{$IFDEF WEAKREF} // Allgemein
{$IFDEF WEAKINSTREF} // Object {$IFDEF WEAKINTREF} // Interface |
AW: ARC - Weak-Referenzen mit unterschiedlichem Verhalten bei ARC und Nicht-ARC
Zitat:
|
AW: ARC - Weak-Referenzen mit unterschiedlichem Verhalten bei ARC und Nicht-ARC
Zitat:
Mavarik |
AW: ARC - Weak-Referenzen mit unterschiedlichem Verhalten bei ARC und Nicht-ARC
Weak-Referenzen gibt es dort (noch) nicht.
Für Interfaces würde ich wir wünschen, daß die es endlich mal einbauen (die Unterscheidung von WEAKINSTREF und WEAKINTREF lässt mir noch Hoffnung, daß es "bald" kommt) und ob ARC nicht irgendwann auch in anderen Plattformen Einzug findet, ist nicht klar. Also machen kann man nichts, aber man würde wenigstens sofort erkennen, daß
Delphi-Quellcode:
dort keine Funktion hat.
[Weak]
Aber so merkt man es erst zur Laufzeit, wenn es knallt und raucht. Für Interfaces kann man Weak-Referenzen auch nachbauen, was ich für mich bereits gemacht hab, dank der Operatoren. |
AW: ARC - Weak-Referenzen mit unterschiedlichem Verhalten bei ARC und Nicht-ARC
Zitat:
|
AW: ARC - Weak-Referenzen mit unterschiedlichem Verhalten bei ARC und Nicht-ARC
Für normale Instanzen kann man WeakReference auch nachbauen. Bei der Umsetzung dessen bin ich auf dieses Verhalten erst gestossen. Gut für Nicht-ARC ist es schon ganz schöner Schweinecode, aber funktioniert zuverlässig und auf beiden Architekturen.
|
AW: ARC - Weak-Referenzen mit unterschiedlichem Verhalten bei ARC und Nicht-ARC
Zitat:
![]() |
Alle Zeitangaben in WEZ +1. Es ist jetzt 04:08 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