我没有使用接口(因此对象没有引用计数)。对象可能被许多其他人引用,我需要处理悬空指针。 FreeAndNil()不能解决多个引用的问题。我需要在对象被销毁时,所有引用它的指针都会自动设置为nil。或者它可能类似于C ++中std :: weak_ptr的Expired()方法。
我可以实现一个“弱智能指针”来做到这一点,但我不确定它是否是一个过于复杂的实现。你建议另一个解决方案吗?这是我正在考虑的未经测试的可能解决方案:
type
TWeakReferenceable = class
constructor Create();
destructor Destroy(); override; //Set ReferencedObject:=nil for all the weak references in FWeakReferenceList
private
FWeakReferenceList: TList; //List of weak references to this object
protected
procedure RegisterWeakReference(const AWeakReference: TWeakReference<TWeakReferenceable>); //Adds a weak reference
procedure UnregisterWeakReference(const AWeakReference: TWeakReference<TWeakReferenceable>); //Removes a weak reference
end;
type
TWeakReference<TObjectType: TWeakReferenceable> = class
constructor Create();
destructor Destroy(); override; //Destroys the object and calls UnregisterWeakReference(self) for the referenced object
private
FObjectReference: TObjectType;
procedure SetReference(AReferencedObject: TObjectType); //Calls UnregisterWeakReference(self) for the current reference, updates FObjectReference and calls RegisterWeakReference(self) for the referenced object
public
property ReferencedObject: TObjectType read FObjectReference write SetReference;
end;
答案 0 :(得分:4)
对于移动平台,Delphi对对象使用ARC(自动引用计数),编译器具有[weak]
属性,用于声明在释放引用对象时自动填充的弱指针。
对于桌面平台,Delphi不使用ARC作为对象。但是,TComponent
有自己的机制来处理“弱”引用 - 它的FreeNotification()
方法。当组件对另一个组件的生命周期感兴趣时,它必须调用另一个组件的FreeNotification()
方法。 TComponent
维护感兴趣组件的内部列表。当释放TComponent
对象时,它会调用那些感兴趣组件的Notication()
方法,这样他们就可以忽略对被释放组件的引用。
但是,您展示的代码并未使用TComponent
。因此,您必须创建自己的注册/通知系统,以取消对已释放对象的引用。