MATLAB处理类对象是
deleted when they go out of scope.我有一些可以在应用程序的不同部分重用的对象,但是当我们不再在任何地方使用时,我想要破坏它们. MATLAB内置的生命周期行为允许我这样做,而不需要保留任何附加的全局列表来跟踪可能使用该对象的内容.
然而,我有一种情况,我认为应该超出范围的对象仍然是触发事件侦听器回调,作为对象的析构函数的一部分被删除.我知道我认为存在的这个对象的最后一个句柄应该被存储,当我检查那个句柄已经被清除的时候肯定够了.所以必须有这个句柄的范例在其他地方的实例.
我的应用程序是一个复杂的对象网络,存储为其他对象的属性.有什么我可以做的,以帮助跟踪在这个对象的句柄存储在哪里?
例
首先设置一个句柄类与一个事件来听:
classdef Yard < handle
events
RollCall
end
end
然后一个句柄类通过显示一些文本然后通知自己的事件,从一个Yard对象中对RollCall事件作出反应:
classdef Kennel < handle
properties
id
yardListener
end
events
RollCall
end
methods
function obj = Kennel(yard,id)
obj.yardListener = event.listener(yard,'RollCall',@obj.Report);
obj.id = id;
end
function Report(obj,~,~)
fprintf('Kennel %d is in the yard\n', obj.id);
notify(obj,'RollCall');
end
end
end
最后一个类,通过显示一些文本来响应来自Kennel对象的RollCall事件:
classdef Dog
properties
name
kennel
kennelListener
end
methods
function obj = Dog(name,kennel)
obj.name = name;
obj.kennel = kennel;
obj.kennelListener = event.listener(kennel,'RollCall',@obj.Report);
end
function Report(obj,kennel,~)
fprintf('%s is in kennel %d\n', obj.name, kennel.id);
end
end
end
现在,将这些类的一些实例添加到工作区:
Y = Yard;
% Construct two Dog objects, in each case constructing a new Kennel object to pass to the constructor
dogs = [Dog('Fido',Kennel(Y,1)) Dog('Rex',Kennel(Y,2))];
% Construct a third Dog, reusing the Kennel object assigned to dog(1)
dogs(3) = Dog('Rover',dogs(1).kennel);
我现在有两个范围内的Kennel对象,在数组dog中的Dog对象的属性中引用了句柄.调用notify(Y,’RollCall’)产生以下输出:
Kennel 2 is in the yard
Rex is in kennel 2
Kennel 1 is in the yard
Rover is in kennel 1
Fido is in kennel 1
如果原来的两只狗被删除,那么狗窝2超出了范围,但狗窝1仍然保持活动,因为它仍然被剩下的狗引用:
>> dogs = dogs(3);
>> notify(Y,'RollCall')
Kennel 1 is in the yard
Rover is in kennel 1
然而,如果我在删除剩余的狗之前,在范围内的其他地方隐藏一个额外的句柄,那么它将保持活动状态:
>> t = timer('UserData',dogs(1).kennel);
>> clear dogs
>> notify(Y,'RollCall')
Kennel 1 is in the yard
问题是如果我不知道这个额外的引用是在哪里或者什么时候创建的,为什么它不被删除,我可以做些什么来调试对象的存在?