Matlab oop-从内存中清除对象不会调用';删除';方法如预期 上下文
我在matlab中创建了两个类似的Matlab oop-从内存中清除对象不会调用';删除';方法如预期 上下文,matlab,oop,Matlab,Oop,我在matlab中创建了两个类似的PrimarySettings和SecondarySettings句柄类来存储我自己的设置,为了方便起见,我愿意将它们组合到一个更大的AllSettings类中 所有类都有一个PropertyChanged事件来监视设置修改 所有类的代码都可以从中可视化 问题 当我测试PrimarySettings和SecondarySettings类以检查它们是否在代码中不再引用所有实例时有效地调用了它们的delete方法时,我没有问题: >> ps = Prim
PrimarySettings
和SecondarySettings
句柄类来存储我自己的设置,为了方便起见,我愿意将它们组合到一个更大的AllSettings
类中
所有类都有一个PropertyChanged
事件来监视设置修改
所有类的代码都可以从中可视化
问题
当我测试PrimarySettings
和SecondarySettings
类以检查它们是否在代码中不再引用所有实例时有效地调用了它们的delete
方法时,我没有问题:
>> ps = PrimarySettings();
>> clear ps;
Destroying PrimarySettings.
>> ss = secondarySettings();
>> clear ss;
Destroying SecondarySettings.
在测试正确的事件通知时也是如此:
>> as = AllSettings();
>> as.PrimarySettings.Titi = 12;
Property 'PrimarySettings.Titi' modified.
问题只存在于从未调用其delete
方法的AllSettings
类:
>> as = AllSettings();
>> clear as;
!!!!!! here delete method is not called !!!!!
对象仍在内存中,但不再被引用。这可以通过如下方式进行测试:
>> clear classes
Warning: Objects of 'SecondarySettings' class exist. Cannot clear this class or any of its superclasses.
Warning: Objects of 'PrimarySettings' class exist. Cannot clear this class or any of its superclasses.
Warning: Objects of 'AllSettings' class exist. Cannot clear this class or any of its superclasses.
调查
这个问题似乎与我附加PropertyChanged
事件的方式有关(侦听器可能还活着)
不幸的是,我真的不明白为什么。实际上,在我创建的所有类中,用于附加到事件的代码都非常相似
主要设置
和次要设置
:
for idx = 1:propCount;
listener = addlistener(obj, meta.PropertyList(idx).Name, 'PostSet', @obj.onPropertyChanged);
listener.Recursive = true;
end
for idx = 1:propCount;
propName = meta.PropertyList(idx).Name;
listener = addlistener(obj, propName, 'PostSet', @obj.onPropertyChanged);
listener.Recursive = true;
listener = addlistener(obj.(propName), 'PropertyChanged', @obj.onSubPropertyChanged);
listener.Recursive = true;
end
所有设置
:
for idx = 1:propCount;
listener = addlistener(obj, meta.PropertyList(idx).Name, 'PostSet', @obj.onPropertyChanged);
listener.Recursive = true;
end
for idx = 1:propCount;
propName = meta.PropertyList(idx).Name;
listener = addlistener(obj, propName, 'PostSet', @obj.onPropertyChanged);
listener.Recursive = true;
listener = addlistener(obj.(propName), 'PropertyChanged', @obj.onSubPropertyChanged);
listener.Recursive = true;
end
注意:如果我对第二个侦听器进行注释(即onSubPropertyChanged
),则AllSettings
类将按预期工作
问题:
删除
所有设置
对象有什么问题?如果您需要对该问题进行特定诊断,恐怕您需要发布更多代码,以便我们能够准确跟踪发生的情况
但我认为问题在于,您的一个侦听器正在以一种您不希望的方式存储对另一个对象的引用,因此在调用clear
时它不会被破坏
为了帮助您进一步诊断问题,请注意有两种创建侦听器的方法:
addlistener
,将侦听器的生命周期与作为事件源的对象联系起来event.listener
构造侦听器,其中侦听器仅在其位于范围内时存在,并且不与事件生成对象的存在相关联希望有帮助 谢谢你的回复。我将尽快尝试使用
event.listener
,因为我还认为侦听器正在保持源代码的活动状态。顺便问一下,你发布更多代码是什么意思(所有类的源代码都可用)?@citizensanse抱歉,我没有注意到这个链接。太好了!使用weakListener=event.listener(…)
语法而不是tiedListener=addlistener(…)
one解决了问题(更新代码)。谢谢。