Объекты класса управления MATLAB удаляются, когда они выходят за пределы области видимости. У меня есть объекты, которые можно использовать повторно в разных частях приложения, но которые я хочу уничтожить, когда они больше не используются нигде. MATLAB, построенный по жизненному циклу, позволяет мне это делать, не поддерживая какой-либо дополнительный глобальный список, чтобы отслеживать, что может использовать этот объект.
Однако у меня есть ситуация, когда объект, который, как мне кажется, должен был выйти из области действия, по-прежнему вызывает вызовы прослушивателя событий, которые удаляются как часть деструктора объекта. Я знаю, где, по-моему, последний дескриптор этого объекта должен быть сохранен, и, конечно, достаточно, когда я проверю, что этот дескриптор был очищен. Поэтому в этом месте должны быть экземпляры этого дескриптора.
Мое приложение представляет собой сложную сеть объектов, хранящихся как свойства других объектов. Есть ли что-нибудь, что я могу сделать, чтобы помочь отследить, где в области хранения дескриптор этого объекта хранится?
Пример
Сначала настройте класс дескриптора с событием для прослушивания:
classdef Yard < handle
events
RollCall
end
end
Затем класс дескриптора, который реагирует на события RollCall
от объекта Yard
, отображая некоторый текст, а затем уведомляет о своем собственном событии:
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
И, наконец, класс, который реагирует на события RollCall
от объекта Kennel
, отображая некоторый текст:
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
в массиве dogs
. Вызов 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
Если исходные два Dog
удалены, то питомник 2 выходит за пределы области действия, но питомник 1 остается активным, так как на него все еще ссылаются остальные Dog
:
>> dogs = dogs(3);
>> notify(Y,'RollCall')
Kennel 1 is in the yard
Rover is in kennel 1
Однако, если я скрою дополнительный дескриптор питомника 1 в другом месте в области до удаления оставшегося Dog
, он останется активным:
>> t = timer('UserData',dogs(1).kennel);
>> clear dogs
>> notify(Y,'RollCall')
Kennel 1 is in the yard
Вопрос в том, не знаю, где и когда эта дополнительная ссылка была создана и почему она не была удалена, что я могу сделать, чтобы отладить существование объекта?