DelFusa Blog 総本山

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

NEW | PAGE-SELECT | NEXT

≫ EDIT

スポンサーサイト

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

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

≫ EDIT

TInterfacedObject で自動破棄


   .。○(温暖かーぁ)
  ∧,,∧ 
 ミ,,, ,彡⊃``;⊃
  ∩;,,,,,,,,,,,,,,,,,,,;⊃ 



この夏は、非常に温暖化でしたね。
「不都合な真実」でゴアゴアを見た俺にはわかりますが、

もう地球にはそろそろ後がない。

そういう実感がします。それくらい暑い!



さて、Delphiが死滅すると言われたりいわれなかったりしますけれども
地球が死滅するのと、どちらが早いのだろうか。
そんな気がしてくるくらいの暑さですね。

みんなが、.NETに移行して遅いアプリを作っている間に
俺はDelphiで早いアプリを作れるから、みんな.NETに行けばいいのにと
思ったり思わなかったりしなくもありません。

既存のDelphi仕事は、俺が全部引き受けるので、Delphi仕事があれば俺に声をかけるといいですよ(w


  ∧,,∧ 
 ミ,,゚Д゚ミ ⊃``;⊃   ウソウソ
  ∩;,,,,,,,,,,,,,,,,,,,;⊃    ネタネタ



さて、
とりあえず、自動破棄系のコードを使っていきましょう。
前回はTInterfacedObjectを使うまでもない、、、、というか、使うところまでにも
至りませんでした。


まずはじめに、メモリリーク調査してみておきます。

procedure TForm1.FormCreate(Sender: TObject);
begin
  ReportMemoryLeaksOnShutdown := True;
end;

このようにコードを書いておくと、アプリ終了時にメモリリークしていればメモリリーク報告してくれます。
これは・・・いつのバージョンからかな。
俺のD2007では動いています。

試してみましょう。

type
 TMyClass1 = class
  FName: String;
 end;

procedure TForm1.Button1Click(Sender: TObject);
var
 MyObject: TMyClass1;
begin
 MyObject := TMyClass1.Create;
 //当たり前のようにメモリリークする
end;

アプリケーションを終了する事で、レポートが出ますよね。

では、待望のTInterfacedObjectを使ってみます。

type
 TMyClass2 = class(TInterfacedObject)
 public
  Name: String;
 end;

procedure TForm1.Button2Click(Sender: TObject);
var
 MyObject: TMyClass2;
begin
 MyObject := TMyClass2.Create;
 //やっぱりメモリリークする
end;

TInterfacedObject を継承したからって、自動破棄はされないわけで、
まだまだ使い方が違っている様子。

procedure TForm1.Button3Click(Sender: TObject);
var
 MyInterface: IUnknown;
begin
 MyInterface := IUnknown(TMyClass2.Create);
 //メモリリークはしない!
end;

ただし、MyInterfaceは何のメソッドも定義がないので
変数に代入しても、キャストしてメソッドを呼ばなければいけないのはかなり不便っと。

なので、メソッドやプロパティを持つインターフェースを定義する


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

 TMyClass3 = class(TInterfacedObject, IMyClass3)
 private
  FName: String;
  function GetName: String;
  procedure SetName(const Value: String);
 public
  property Name: String read GetName write SetName;
 end;

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

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

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

 ShowMessage(MyInterface.Name);
end;

これで、とりあえず、破棄はいらないコードが実現できました。

            

  ∧,,∧       デキマシタ !
 ミ,,゚Д゚ミ ⊃``;⊃   
  ∩;,,,,,,,,,,,,,,,,,,,;⊃ 


つづきは、ラタマイシュー
スポンサーサイト

| 未分類 | 12:19 | comments:0 | trackbacks(-) | TOP↑

COMMENT















非公開コメント

PREV | PAGE-SELECT | NEXT

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