System.Defer
1.0.0
延期Delphi
從曲折編程語言中延遲資源(對象,內存或取消動作)的機制的類似物。
該機制的本質是,經過一定的操作,創建一個取消操作,該操作將在塊退出時執行。
也就是說,例如,我們創建了一個對象,創建後,我們編寫瞭如何釋放它,並且將在退出塊後自動發布。
該機制在界面基礎上起作用。
將異常放在塊中並不能阻止對象的釋放。
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 ;