Und man kann viel Unfug mit solchen Settern anrichten: ...
Man muß es nur richtig machen.
Delphi-Quellcode:
type
TMyClass = class(TComponent)
private
FInstance: TComponent;
procedure SetInstance(Value: TComponent);
protected
procedure Notification(AComponent: TComponent; Operation: TOperation); override;
published
property Instance: TComponent read FInstance write SetInstance;
end;
procedure TMyClass.Notification(AComponent: TComponent; Operation: TOperation);
begin
inherited;
if Operation = opRemove then begin
if FInstance = AComponent then
FInstance := nil;
end;
end;
procedure TMyClass.SetInstance(Value: TComponent);
begin
//if Assigned(FInstance) then begin
// FInstance.RemoveFreeNotification(Self);
FInstance := Value;
if Assigned(FInstance) then begin
FInstance.FreeNotification(Self);
end;
FreeNotification hat keine Referenzzählung.
Weitere Property und auch Onwer oder Parent registrieren das ebenfalls, also einfach garnicht deregistrieren. (macht die TComponent von selber, wenn Einer von Beiden freigegeben wird)
Also kann man deregistrieren, aber nur wenn man die volle Kontrolle über alle Referenzen besitzt, oder wenn man definitiv nur die eintige Referenz sein kann. (nur interne Instanzen, auf die es von Extern keinen Zugriff gibt)
FInstance.FreeNotification(Self);
und
Self.FreeNotification(FInstance);
ist das Gleiche ... die registrieren sich gegenseitig.
Unter ARC könnte man auch Weak-Referenzen nutzen, wo das ARC diese global registriert und auf NIL setzt, wenn jemand die Instanz freigibt.
var [weak] Instance: TComponent;