我在matlab中创建了两个类似的PrimarySettings
和SecondarySettings
句柄类来存储我自己的设置,并且为了方便起见,我们愿意将它们分组到一个更大的AllSettings
类中。
所有课程都有一个PropertyChanged
事件来监控设置修改。
可以从here可视化所有类的代码。
当我测试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.
问题仅出在AllSettings
类,而根本不会调用delete
方法:
>> 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
事件的方式有关(监听器可能还活着)。
不幸的是,我真的不明白为什么。实际上,在我创建的所有类中,附加到事件的代码非常相似。
PrimarySettings
和SecondarySettings
:
for idx = 1:propCount;
listener = addlistener(obj, meta.PropertyList(idx).Name, 'PostSet', @obj.onPropertyChanged);
listener.Recursive = true;
end
AllSettings
:
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
班级将按预期工作!
删除AllSettings
个对象有什么问题?
答案 0 :(得分:1)
如果您需要对问题进行具体诊断,我担心您需要发布更多代码,以便我们可以追踪到究竟发生了什么。
但我希望问题是你的一个听众以你不期望的方式存储对你另一个对象的引用,所以当你调用clear
时它不会被破坏。 / p>
为了帮助您进一步诊断事物,请注意有两种方法可以创建侦听器:
addlistener
,它将侦听器的生命周期与作为事件源的对象联系起来。event.listener
直接构造侦听器,其中侦听器仅在其在范围内时存在,并且不依赖于事件生成对象的存在。有关详细信息,请参阅Events and Listeners — Syntax and Techniques上此文档页面中的“创建侦听器的方法”部分。
希望有所帮助!