У меня есть два класса, Plant
и Generator
.Generator
создает вектор и передает его через notify()
, который Plant
прослушивает.Classdefs ниже.Обратите внимание, что я не включил реальный метод генерации данных, потому что он не имеет отношения к моему вопросу.
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
экземпляр, он не запускает деструктор до тех пор, пока я не создам экземпляр 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?
Очень важно, чтобы мой деструктор запускался каждый раз.Что здесь происходит, и как я могу заставить деструктор работать должным образом?(Я мог бы просто полностью удалить слушателя и напрямую вызвать Plant.ListenerCallback()
из экземпляра Generator
, если это не сработало.)
РЕДАКТИРОВАТЬ : Похоже, когда я делаю clear G
, переменная G
удалена из рабочей области, но объект Generator
остается в P.Listener.Source
.Вот почему деструктор не вызывается.Поэтому я думаю, что нет способа избавиться от P.Listener
, удалив G
.., есть ли способ заставить это делать то, что я хочу, или я просто застрял?