问题描述
我想使用类的方法而不将其创建分配给变量。例如:
type
TMyObject = class
public
procedure DoSomething;
end;
implementation
procedure MyObjDoesSomething;
begin
TMyObject.Create.DoSomething;
end;
{ TMyObject }
procedure TMyObject.DoSomething;
begin
// ...
end;
如您所见,在MyObjDoesSomething
中,我没有将TMyObject.Create
分配给TMyObject
变量。
这是否会对内存使用产生某种影响,甚至是我没有想到的其他事物?
解决方法
如果您Create
为对象分配内存,则在使用完该对象以释放该内存时,必须在该对象上调用Free()
,否则内存会泄漏,这将影响内存随着时间的推移,如果您多次创建这些对象。
如果您不想使用显式变量来引用对象(为什么?),则可以使用with
块,例如:
procedure MyObjDoesSomething;
begin
with TMyObject.Create do
try
DoSomething;
finally
Free;
end;
end;
另一种选择是使类实现interface
,然后可以让编译器的接口引用计数为您处理释放对象。这比上面有更多的开销,但是您不必担心手动处理内存,例如:
type
IMyObject = interface
['{896FF4FA-A974-4A8B-9EA5-414C138635E4}']
procedure DoSomething;
end;
TMyObject = class(TInterfacedObject,IMyObject)
public
procedure DoSomething;
end;
implementation
procedure MyObjDoesSomething;
begin
(TMyObject.Create as IMyObject).DoSomething;
end;
{ TMyObject }
procedure TMyObject.DoSomething;
begin
// ...
end;
但是实际上,只需使用变量即可。它不花钱使用:
procedure MyObjDoesSomething;
var
Obj;
begin
Obj := TMyObject.Create;
try
Obj.DoSomething;
finally
Obj.Free;
end;
end;
,
是的,影响很大:一次不错的内存泄漏!
您调用对象的构造函数,但从不释放创建的对象。每次调用MyObjDoesSomething时,都会泄漏对象实例。
要解决该问题,您可以制作一个DoSomething的类方法,如下所示:
type
TMyObject = class
public
class procedure DoSomething;
end;
然后您可以调用DoSomething,而无需创建这样的对象:
procedure MyObjDoesSomething;
begin
TMyObject.DoSomething;
end;
作为类方法,DoSomething实现不能使用对象实例变量(字段)。