I have two classes, Plant
and Generator
. Generator
creates a vector and broadcasts it via notify()
, which Plant
listens for. The classdefs are below. Note that I didn't include the actual data-generation method because it's irrelevent to my question.
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
I noticed that the Generator
destructor behaves really oddly: the first time I create then delete a Generator
instance, it does not run the destructor until the second time I create the Generator
instance. Here's an example:
>> 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?
It's pretty important that my destructor runs every time. What is going on here, and how can I get the destructor to operate properly? (I might just remove the listener altogether and directly call Plant.ListenerCallback()
from the Generator
instance if this doesn't work out.)
EDIT: Looks like when I do clear G
, the variable G
is removed from the workspace - but the Generator
object lives on in P.Listener.Source
. This is why the destructor isn't being called. So I guess there's no way to get rid of P.Listener
by deleting G
.. is there any way to get this to do what I want or am I just stuck?