我有(静态)类GT_MyClass
GT_MyClass = class
private
class var FImage : TJpegImage;
class function GetImage: TJpegImage;
public
property Image : TJpegImage read GetImage;
end;
在函数GetImage中我创建了FImage,如果它还不存在的话。
class function GT_Myclass.GetImage: TJpegImage;
begin
if not Assigned(FImage) then
begin
FImage := TJpegImage.Create;
end;
Result := FImage;
end;
在最终确定中我想要FreeAndNil(FImage)
finalization
if Assigned(FImage) then
FreeAndNil(FImage);
但是在最终版块中我看不到私有的var FImage ......
请你能帮帮我吗?
谢谢!
BTW:我想要属性Image绝对是静态的
答案 0 :(得分:5)
这是由于范围不同造成的。在类方法中,GT_MyClass.GetImage
您的代码在类的范围内,因此可以看到类成员。终结部分在全局范围内执行。因此,您可以通过限定名称来编译代码:
finalization
if Assigned(GT_MyClass.FImage) then
FreeAndNil(GT_MyClass.FImage);
事实上,由于GT_MyClass.FImage
已经这样做,因此对Free
分配的测试毫无意义。所以你会写:
finalization
FreeAndNil(GT_MyClass.FImage);
或者你可以提供另一种类的方法,它可以更好地封装它:
type
GT_MyClass = class
private
class var FImage : TJpegImage;
class function GetImage: TJpegImage;
class procedure Finalize;
public
property Image : TJpegImage read GetImage;
end;
....
class procedure GT_MyClass.Finalize;
begin
FreeAndNil(FImage); // in scope of class, no need to qualify
end;
....
finalization
GT_MyClass.Finalize;
但是这仍然让你从课外调用私有方法,这是不理想的。所以你可以使用class destructor,它是从单位的终结代码中执行的:
type
GT_MyClass = class
private
class var FImage : TJpegImage;
class function GetImage: TJpegImage;
class destructor ClassDestroy;
public
property Image : TJpegImage read GetImage;
end;
....
class destructor GT_MyClass.ClassDestroy;
begin
FreeAndNil(FImage); // in scope of class, no need to qualify
end;
不需要最终化代码,编译器会自动确保调用类析构函数。