11

class があるとしmyClass < handleます。のMathworks ヘルプ ページからclear

ハンドル グラフィックス ハンドルをクリアしても、オブジェクト自体は削除されず、オブジェクトを削除しても、ハンドルを格納している変数は削除されません。

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に明示的に指定しない限り、ハンドル オブジェクトを ing してもメモリから削除されませんdelete

デストラクタを指定して、myClass適切なクリーンアップを行い、それへの参照をいくつか削除しました。このデストラクタは呼び出されませんclear。オブジェクトがクリアされたときにそのデストラクタを呼び出すことはできますか?

編集:オブジェクトへの参照がない場合、 whiledeleteは a で自動的に呼び出されることに言及する必要があります。たとえば、 を参照するプロパティを持つ別のクラスがあります。のプロパティではないその他のプロパティが にありますが、 も空の場合は空にする必要があります。それが意味をなさない場合はお知らせください。少し言葉が多すぎた可能性があります。clearmyClassmyOtherClassmyClassmyOtherClass.amyOtherClassmyClassmyOtherClass.a

4

1 に答える 1

13

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

ハンドル グラフィックスの「オブジェクト」は、myClass と同じタイプの「オブジェクト」ではなく、返される「ハンドル グラフィックス ハンドル」は、継承figure()元の名前のクラスと同じ種類のものではありません。handle「ハンドル グラフィックス ハンドル」についての話からの一節はhelp clear、オブジェクトには適用されません。該当するドコdoc handleの方法はリンク先を参照してください。delete

気分を悪くしないでください。Matlab doco では、これらの区別があまり明確ではありません。(IIRC では「MCOS」という用語を明示的に使用することさえありません。単に「オブジェクト」と呼んでいます。) 基本的に、ドキュメントの「オブジェクト指向プログラミング」セクションの下の資料は、「オブジェクト」の種類に関連しており、あなたが取り組んでいる「ハンドル」myClass。「グラフィックス」と「GUI 開発」の下の doco は、「オブジェクト」と「ハンドル」の他のハンドル グラフィックスの種類について話しています。彼らは、ハンドルグラフィックスには「ハンドル」、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
>> 

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

于 2011-08-29T23:06:39.490 に答える