DelFusa Blog 総本山

プログラミングの話題とかです。

NEW | PAGE-SELECT | NEXT

≫ EDIT

スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

| スポンサー広告 | --:-- | comments(-) | trackbacks(-) | TOP↑

≫ EDIT

TInterfacedObjectの破棄タイミング


                 
  "(,∩,,,,,,∧,,∧    ナツ  デカケタカ?
 ⊂",,,,,,,,,,つ゚Д゚ミつ
^^^^^^^^^^^^^^^^^^^


TInterfacedObjectの
破棄タイミングをしらべたぞい



type
 IMyClass4 = interface
  function GetName: String;
  procedure SetName(const Value: String);
  property Name: String read GetName write SetName;
 end;

 TMyClass4 = class(TInterfacedObject, IMyClass4)
 private
  FName: String;
  function GetName: String;
  procedure SetName(const Value: String);
 public
  destructor Destroy; override;
  property Name: String read GetName write SetName;
 end;

{ TMyClass4 }

destructor TMyClass4.Destroy;
begin
 ShowMessage('破棄された!');   ……①
 inherited;
end;

function TMyClass4.GetName: String;
begin
 Result := FName;
end;

procedure TMyClass4.SetName(const Value: String);
begin
 FName := Value;
end;


procedure TForm1.Button5Click(Sender: TObject);
var
 MyInterface: IMyClass4;
begin
 MyInterface := IMyClass4(TMyClass4.Create);
 MyInterface.Name := 'ABCDEFG';
 //これでメモリリークしないし、Nameプロパティが使える

 MyInterface := nil;

 ShowMessage('破棄された後です');  ………②
end;

procedure TForm1.Button6Click(Sender: TObject);
begin
 with IMyClass4(TMyClass4.Create) do
 begin
  Name := 'ABCDE';
 end;

 ShowMessage('破棄される前!'); ………③

end;

Button5.Clickの動作的には
①②の順番で、メッセージ表示されますが
MyInterface に nilを代入するのをやめると
メソッドを抜けるまで破棄されないので

メッセージ表示順は、②①になります。



with ブロックに対して、Createかけたときには
擬似的に、メソッド内ローカル変数に代入されるのとおなじように
動作するようです。

Button6.Clickでの動作は
③①の順番になります。

スポンサーサイト

| 未分類 | 02:53 | comments:0 | trackbacks(-) | TOP↑

COMMENT















非公開コメント

PREV | PAGE-SELECT | NEXT

上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。