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 ;