Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Cross-Platform-Entwicklung (https://www.delphipraxis.net/91-cross-platform-entwicklung/)
-   -   Delphi ARC - Weak-Referenzen mit unterschiedlichem Verhalten bei ARC und Nicht-ARC (https://www.delphipraxis.net/183253-arc-weak-referenzen-mit-unterschiedlichem-verhalten-bei-arc-und-nicht-arc.html)

Sir Rufo 23. Dez 2014 14:54


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:
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;
Unter Nicht-ARC erhält man die Ausgabe
Code:
1. Klick
RealInstance XXXXXXX
WeakInstance XXXXXXX
2. Klick
RealInstance 0
WeakInstance XXXXXXX
Unter ARC erhält man im Gegensatz dazu folgendes
Code:
1. Klick
RealInstance XXXXXXX
WeakInstance XXXXXXX
2. Klick
RealInstance 0
WeakInstance 0
Da wird also der Wert der Weak-Referenz auf
Delphi-Quellcode:
nil
gesetzt, wenn die Instanz aus dem Speicher fliegt.

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:
nil
:stupid:)

Daniel 23. Dez 2014 15:04

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.

Stevie 23. Dez 2014 15:10

AW: ARC - Weak-Referenzen mit unterschiedlichem Verhalten bei ARC und Nicht-ARC
 
Zitat:

Zitat von Sir Rufo (Beitrag 1284557)
Ist irgendjemandem bewusst gewesen, dass dieses Konstrukt sich auf ARC und Nicht-ARC anders verhält

Logisch, Nicht-ARC = nix weak. Ergo ist auf Nicht-ARC FWeakInstance auch keine Weakreference, weswegen sie auch nicht angefasst wird.

himitsu 23. Dez 2014 15:15

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:
[Weak]
einfach mal so ignoriert. :wall:

Delphi-Quellcode:
{$IFDEF WEAKREF} // Allgemein
{$IFDEF WEAKINSTREF} // Object
{$IFDEF WEAKINTREF} // Interface

Daniel 23. Dez 2014 15:25

AW: ARC - Weak-Referenzen mit unterschiedlichem Verhalten bei ARC und Nicht-ARC
 
Zitat:

Zitat von himitsu (Beitrag 1284562)
Der blöde Compiler gibt dir nichtmal eine Warnmeldung, wenn er das
Delphi-Quellcode:
[Weak]
einfach mal so ignoriert. :wall:

Was würdest Du denn als Reaktion auf so eine Warnung tun wollen? Wie Stevie schon schrieb, gibt es unter den klassischen Compilern kein ARC und damit auch kein Weak.

Mavarik 23. Dez 2014 15:28

AW: ARC - Weak-Referenzen mit unterschiedlichem Verhalten bei ARC und Nicht-ARC
 
Zitat:

Zitat von Daniel (Beitrag 1284564)
Zitat:

Zitat von himitsu (Beitrag 1284562)
Der blöde Compiler gibt dir nichtmal eine Warnmeldung, wenn er das
Delphi-Quellcode:
[Weak]
einfach mal so ignoriert. :wall:

Was würdest Du denn als Reaktion auf so eine Warnung tun wollen? Wie Stevie schon schrieb, gibt es unter den klassischen Compilern kein ARC und damit auch kein Weak.

Merken, dass "mein" Sourcecode nicht Plattformübergreifend funktioniert und ein IFDEF einfügen...

Mavarik

himitsu 23. Dez 2014 16:37

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:
[Weak]
dort keine Funktion hat.
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.

Der schöne Günther 23. Dez 2014 16:43

AW: ARC - Weak-Referenzen mit unterschiedlichem Verhalten bei ARC und Nicht-ARC
 
Zitat:

Zitat von himitsu (Beitrag 1284571)
Für Interfaces kann man Weak-Referenzen auch nachbauen, was ich für mich bereits gemacht hab, dank der Operatoren.

Das möchtest du bestimmt einmal zeigen. :wink:

Sir Rufo 23. Dez 2014 17:14

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.

Stevie 23. Dez 2014 17:44

AW: ARC - Weak-Referenzen mit unterschiedlichem Verhalten bei ARC und Nicht-ARC
 
Zitat:

Zitat von Sir Rufo (Beitrag 1284577)
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.

Spar dir die Arbeit, hab ich schon fertig :stupid:


Alle Zeitangaben in WEZ +1. Es ist jetzt 04:08 Uhr.
Seite 1 von 2  1 2      

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