我需要控制 Matlab 中值类对象的销毁。 问题如下。
我有一些程序(我们称之为MyProg
),它在执行期间创建一个值类对象(我们称之为MyValClass
)。MyValClass
有一个句柄类对象作为其属性之一(我们称之为MyHandClass
)。该句柄类启动一些MyProg
侦听的事件。
出现的问题是MyValClass
对象被销毁(通常在异常或用户终止时发生)。我猜,因为仍然有侦听器在听MyHandClass
的事件,所以MyHandClass
对象不会被销毁,而是保留在内存中。
我想控制对象的销毁MyValClass
以便我可以隐式删除其MyHandClass
属性。可能吗?
以下是句柄与值类的一些背景知识:
值类的对象不会被"销毁",并且它们没有析构函数方法。将值类视为在设置
a = 1
时的行为类似于变量a
。a
在你输入clear a
时不会被"销毁",只是不再有变量a
。值对象只是数据,就像1
一样,它们不会被销毁。即使值类具有称为
delete
的方法,上述情况也是如此。值类上的delete
方法与任何其他方法一样。它不是析构函数,并且在清除变量时不会自动调用它。仅当您显式调用它时,才会调用它。
无论是否实现一个类,句柄类总是有一个名为
delete
的方法,这是一个析构函数方法(即在对象被销毁时调用)。如果你不实现一个,他们将得到一个名为delete
的默认方法,它除了销毁对象外什么都不做。如果实现delete
方法,MATLAB 将在销毁对象时运行该方法。但是总有一个delete
方法是析构函数,即使您没有实现析构函数也是如此。
所以 - 对于你的问题 - 如果你想控制MyValClass
的破坏,你必须把它改成一个句柄类。如果它是一个值类,它不会被销毁,也没有什么可以控制的。
您还可以做其他事情,而不是直接"控制破坏"。例如,创建一个onCleanup
对象。这是一个类,除了在销毁时执行用户指定的函数外,什么都不做(它是一个句柄类,所以它可以做到这一点)。因此,如果代码因异常或用户终止而退出,则将执行onCleanup
析构函数。例如,您可以在其中放置一些代码,这些代码将显式查找对MyHandlClass
的引用并删除它们。
希望对您有所帮助!
值对象的析构函数可能是必需的,例如,如果类负责访问文件中的数据,并且您希望在访问器超出范围时关闭文件。您不希望此类成为句柄类的原因有很多(例如,对象数组上的奇怪行为)
其他原因是创建现有对象计数器。
我的解决方案是定义隐藏属性,delete_onCleanup(@()something)
并将对象分配给此属性。提供给onCleanup
的功能将关闭文件,递减对象计数器等。