2011-08-29 27 views
9

クラスmyClass < handleがあるとします。 Mathworks Help page on clearからMATLAB - 'clear'を使用するときにオブジェクトデストラクタを実行しますか?

ハンドルグラフィックスハンドルを消去してもオブジェクト自体は削除されず、オブジェクトを削除してもハンドルを格納する変数は削除されません。 I最初に明示的deleteそれを...

私は適切なクリーンアップを行うと、それにはいくつかの参照を削除するmyClassのデストラクタを指定しない限り

hf = figure; % Creates figure object, stores handle in variable hf 
delete(hf) % Removes figure object, but not the variable hf 
clear hf  % Removes hf from the workspace; figure could still exist 

のでclearハンドルオブジェクトをすると、メモリから削除されません。このデストラクタはclearに呼び出されません。オブジェクトがクリアされたときにそのデストラクタを呼び出すことは可能ですか?

編集:私はmyClassオブジェクトへの参照がない場合deleteが自動的にclearと呼ばれている間、私は別のクラスを持って、myClassを参照してくださいプロパティでmyOtherClassを言うことを言及する必要があり、myOtherClass.aを言います。 myOtherClassには、myClassのプロパティではないプロパティがありますが、myOtherClass.aも空の場合は空白にする必要があります。それが理にかなっていないかどうかを教えてください。

答えて

10

ハンドルクラスオブジェクトへのすべての参照を消去するとメモリから削除され、オブジェクトが破棄されるとmyClassdeleteメソッドが自動的に呼び出されます。それは単なる不幸な混乱の用語です。 myClassは「MCOSクラス」または「MCOSオブジェクト」であり、help clearのような「ハンドルグラフィックスオブジェクト」ではありません。少なくともMコードレベルでは異なるものです。

ハンドルグラフィック "オブジェクト"はmyClassと同じ "オブジェクト"ではなく、figure()によって返される "ハンドルグラフィックスハンドル"は、あなたが持っているクラスhandleと同じ種類ではありませんから継承する。 help clearからの "handle graphics handles"についての話は、あなたのオブジェクトには当てはまりません。 doc handleを参照し、関連するdocoのdeleteメソッドのリンクに従ってください。

気分を悪くしないでください。 Matlabドコはこれらの区別を非常に明確にしません。 (IIRCでは、「MCOS」という用語を明示的に使用することはなく、「オブジェクト」と呼ぶだけです)。基本的に、ドコの「オブジェクト指向プログラミング」セクションの資料は、オブジェクトの種類に関連しています。あなたが作業している "ハンドル"はmyClassです。 "Graphics"と "GUI Development"の下のdocoは、 "object"と "handle"の他のハンドルグラフィックスの種類について話しています。私は彼らがハンドルのグラフィックスのための用語 "ハンドル"を使用し、OOPのもののための "クラスを処理する"と思う。

deleteが機能することを確認するには、簡単なクラスを作成してください。

classdef myClass < handle 
    methods 
     function delete(obj) 
     disp('delete was called'); 
     end 
    end 
end 

次に、作成してクリアしてください。

>> x = myClass 
x = 
    myClass handle with no properties. 
    Methods, Events, Superclasses 
>> clear x 
delete was called 
>> 

デストラクターが呼び出されていない場合は、オブジェクトの残りの参照が残っている可能性があります。オブジェクトへの参照を保持する変数がクリアされるたびに、デストラクタは呼び出されません。これは、参照を保持する最後の変数(または間接参照)がクリアされたときだけです。

+0

残念なことに、残りのオブジェクトには他の参照があります。この機能が欲しい理由の一部は、私のデストラクタでこれらの参照を取り除くためです。関連情報をOPに更新しました。完全な文脈がなければ理にかなっていないかもしれませんが、完全な文脈は特に質問には関係しません。 –

+0

私は特にカスタムGUI要素を作成するときに同様の問題を抱えています。変数をクリアするときにデストラクタを強制的に呼び出すことはできないと私は考えています。あなたの質問に注意してください、あなたはそれをクリアする前にオブジェクトのdeleteメソッドを単に呼び出すことができます。 – hoogamaphone

+0

ちょっと参考までに、オブジェクト指向のコード(これは主に私が見つかったことです)を持つguiを使用しているときに、デストラクタがクリアで呼び出されないという機能が端末で使用されていると思います。つまり、ユーザーが「クリア」を偶然使用した場合、guiへのハンドルがワークスペースから消去されても、GUIはシャットダウンしません。しかし、ユーザがハンドルに対して 'delete'を呼び出すと、デストラクタは引き続き実行されます。 – Justin

関連する問題