System.Defer
1.0.0
デルファイの延期
ZIGプログラミング言語からのリソースの遅延リリース(オブジェクト、メモリまたはアクションのキャンセル)のメカニズムの類似物。
メカニズムの本質は、何らかのアクションの後、ブロックが終了するときに実行されるキャンセルアクションを作成するということです。
つまり、たとえば、オブジェクトを作成しました。作成後、それをリリースする方法を書き、ブロックを終了した後に自動的にリリースされます。
メカニズムは、インターフェイスに基づいて機能します。
ブロックに例外をスローしても、オブジェクトのリリースが妨げられません。
defer 、現在のブロックを終了しながらステートメントを実行するために使用されます。 errdefer deferのように機能しますが、Errdeferのブロック内にエラーがある場合に関数が返された場合にのみ実行します。
物体
uses
..., System.Defer;
type
...
TTestList = class (TStringList)
procedure DoRaise ;
destructor Destroy; override;
end ;
...
procedure TForm5.Button1Click (Sender: TObject);
begin
var Test := TTestList.Create;
defer(Test); // defer action
Test.Add( ' 1 ' );
Test.Add( ' 2 ' );
Test.Add( ' 3 ' );
Test.DoRaise; // test raise
Test.Add( ' 4 ' );
end ; // free
{ TTestList }
destructor TTestList.Destroy;
begin
ShowMessage( ' test list destroy ' );
inherited ;
end ;
procedure TTestList.DoRaise ;
begin
raise Exception.Create( ' Error Message ' );
end ;
initialization
ReportMemoryLeaksOnShutdown := True; for var i := 1 to 4 do
begin
var Test := TTestList.Create;
defer(Test);
Test.Add( ' 1 ' );
Test.Add( ' 2 ' );
Test.Add( ' 3 ' );
end ; // free of Test each iteration方法
procedure TForm5.Button4Click (Sender: TObject);
begin
BeginUpdate;
defer(EndUpdate); // defer action
// / your code with BeginUpdate
end ;メモリ
var p: Pointer;
GetMem(p, 1024 ); // allocate mem
defer( procedure begin FreeMem(p) end ); // defer action for free mem
// work with p errdefer
function GetList : TTestList;
begin
var List := TTestList.Create;
errdefer(List);
List.DoRaise;
Result := List;
end ;
procedure TForm5.Button5Click (Sender: TObject);
begin
var List := GetList; // exception, and no leaks
List.Free;
end ;