これはこの質問にいくらか関連していますが、完全ではありません。
私には2つのクラスがFunctionWrapper
あり、TimerWrapper
:
classdef FunctionWrapper < handle
methods
function Fcn(obj)
disp('FunctionWrapper.Fcn was called!');
end
end
end
classdef TimerWrapper < handle
properties
Timer
end
methods
function obj = TimerWrapper(other_object)
obj.Timer = timer;
set(obj.Timer, 'Period', 1);
set(obj.Timer, 'ExecutionMode', 'fixedSpacing');
set(obj.Timer, 'TimerFcn', @(event, data) other_object.Fcn);
end
function start(obj)
start(obj.Timer);
end
function stop(obj)
stop(obj.Timer);
end
function delete(obj)
disp('destructor called!');
delete(obj.Timer);
end
end
end
コマンドウィンドウで次のコードを実行するとします。
>> F = FunctionWrapper;
>> T = TimerWrapper(F);
>> clear T %# T's destructor not called
>> timerfind %# just to verify that no, the destructor was never called
Timer Object: timer-1
Timer Settings
ExecutionMode: fixedSpacing
Period: 1
BusyMode: drop
Running: off
Callbacks
TimerFcn: @(event,data)other_object.Fcn
ErrorFcn: ''
StartFcn: ''
StopFcn: ''
何が起きてる?オブジェクトを手動で削除する必要があることは知っていtimer
ますが、それはのデストラクタで処理されると思いましたTimerWrapper
。Amroの醜いが簡単な回避策をclear
使用してコマンドをオーバーロードせずに、ワークスペースから移動する方法はありclear T
ますか?さらに、何も参照してT
いないのに、なぜそれへの参照が存在するのですか?(デストラクタが呼び出されないという事実は、この事実を意味します。)これはタイマーオブジェクト自体に埋め込まれていますか?