TMyClass = class(TObject)
private
  FMyObject: TObject;
  function GetMyObject: TObject;
public
  property MyObject: TObject read GetMyObject write FMyObject;
end;

function TMyClass.GetMyObject: TObject;
begin
  if FMyObject = nil then
    FMyObject := TObject.Create;

  Result := FMyObject;
end;

有时,“MyObject”不是在内部创建的,而是在外部创建并分配给该参数的。如果此对象是在外部创建的,则无法在这种情况下释放它。

我应该创建一个TList并在内部创建的所有对象中添加并销毁析构函数上的所有对象吗?

是否在内部创建参数,如何控制其生存期?您建议做什么?有什么模式可以做到这一点吗?

最佳答案

我会在属性 setter 中设置一个标志

procedure TMyClass.SetMyObject(AObject: TObject);
begin
  if Assigned(MyObject) and FIsMyObject then
    FMyObject.Free;
  FIsMyObject := False;
  FMyObject := AObject;
end;

function TMyClass.GetMyObject: TObject;
begin
  if FMyObject = nil then
  begin
    FMyObject := TObject.Create;
    FIsMyObject := True;
  end;

  Result := FMyObject;
end;

Destructor TMyClass.Destroy;
begin
    if FIsMyObject then
        FMyObject.Free;
end;

关于delphi - 哪种是控制对象字段类型生命周期的最佳方法?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/6571437/

10-09 01:09