matlab 查找其他软件窗口 的句柄,matlab – 查找句柄存储在范围内的位置

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

问题是如果我不知道这个额外的引用是在哪里或者什么时候创建的,为什么它不被删除,我可以做些什么来调试对象的存在?

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值