1

我没有使用接口(所以对象没有引用计数)。这些对象可能被许多其他人引用,我需要处理悬空指针。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; 
4

1 回答 1

4

对于移动平台,Delphi 对对象使用 ARC(自动引用计数),并且编译器具有[weak]用于声明弱指针的属性,当引用的对象被释放时,该弱指针会自动为零。

对于桌面平台,Delphi 不对对象使用 ARC。然而,TComponent它有自己的处理“弱”引用的机制——它的FreeNotification()方法。当一个组件对另一个组件的生命周期感兴趣时,它必须调用另一个组件的FreeNotification()方法。 TComponent维护感兴趣组件的内部列表。当一个TComponent对象被释放时,它会调用Notication()那些感兴趣的组件的方法,这样它们就可以取消对被释放组件的引用。

但是,您显示的代码没有使用TComponent。因此,您必须创建自己的注册/通知系统来消除对已释放对象的引用。

于 2015-07-09T19:25:39.547 回答