Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Matlab oop-从内存中清除对象不会调用';删除';方法如预期 上下文_Matlab_Oop - Fatal编程技术网

Matlab oop-从内存中清除对象不会调用';删除';方法如预期 上下文

Matlab oop-从内存中清除对象不会调用';删除';方法如预期 上下文,matlab,oop,Matlab,Oop,我在matlab中创建了两个类似的PrimarySettings和SecondarySettings句柄类来存储我自己的设置,为了方便起见,我愿意将它们组合到一个更大的AllSettings类中 所有类都有一个PropertyChanged事件来监视设置修改 所有类的代码都可以从中可视化 问题 当我测试PrimarySettings和SecondarySettings类以检查它们是否在代码中不再引用所有实例时有效地调用了它们的delete方法时,我没有问题: >> ps = Prim

我在matlab中创建了两个类似的
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解决了问题(更新代码)。谢谢。