私は2つのクラス、Plant
とGenerator
を持っています。 Generator
は、ベクトルを作成し、notify()
でブロードキャストします。Plant
はこれを待ちます。 classdefは以下の通りです。私は実際のデータ生成方法を含めていないことに注意してください。なぜなら、それは私の質問には無関係だからです。私はGenerator
デストラクタが奇妙な本当に振る舞うことに気づいMATLAB - リスナーが関与するときにオブジェクトデストラクタが実行されない
classdef Plant < handle
properties
Listener
end
methods
function ListenerCallback(obj, data)
#% Perform an operation on data
end
end
end
classdef Generator < handle
properties
plant
end
events
newSignal
end
methods
function obj = Generator(plant)
obj.plant = plant;
obj.plant.Listener = addlistener(obj, 'newSignal', ...
@(src, data) obj.plant.ListenerCallback(data));
end
function delete(obj)
delete(obj.plant.Listener);
disp('Generator instance deleted');
end
end
end
:私はGenerator
インスタンスを削除し、その後初めて作成し、それは私がGenerator
インスタンスを作成する二時までデストラクタを実行しません。ここに例があります:
>> P = Plant
P =
Plant handle
Properties:
Listener: []
Methods, Events, Superclasses
>> G = Generator(P)
G =
Generator handle
Properties:
plant: [1x1 Plant]
Methods, Events, Superclasses
>> clear G #% DESTRUCTOR NOT CALLED??
>> G = Generator(P)
Generator instance deleted #% why is the destructor run now?
G =
Generator handle
Properties:
plant: [1x1 Plant]
Methods, Events, Superclasses
>> clear G
Generator instance deleted #% and why is the destructor run properly now?
私のデストラクタが毎回実行されることは非常に重要です。ここで何が起こっているのですか。デストラクタを適切に動作させるにはどうしたらいいですか? (私は完全にリスナーを削除し、これがうまくいかない場合は、直接Generator
インスタンスからPlant.ListenerCallback()
を呼び出すことができます。)
EDIT:私はclear G
を行う際に、変数G
は、ワークスペースから削除されたように見える - しかし、 Generator
オブジェクトはP.Listener.Source
に存在します。これは、デストラクタが呼び出されていない理由です。だから私はP.Listener
を削除することによって、G
を削除する方法がないと思います..これを私が欲しいものをするために得る方法はありますか?
「削除G」を試してください。 「クリアG」ではなく「G」をクリアしますか?ドキュメントから「Figureや他のオブジェクトのハンドルをクリアすることはできますが、オブジェクト自体は削除されません」deleteを使用してオブジェクトやファイルを削除しても、そのオブジェクトを削除しても、ハンドル。" – tmpearce
@tmpearce - それは動作します。私は 'clear G'を使うことを望んでいました。なぜなら、このコードははるかに大きなコードベースの一部であるからです。 MATLABを使っている人と仕事をするほとんどの人は、 'delete'と' clear'の違いが分からないので、これは本当に混乱するかもしれません。 –
ええ、私は理解しています。デストラクタの問題ではなく、オブジェクトの 'clear'を使うので、この情報で質問を更新したいかもしれません。 – tmpearce