假设我有一个班级myClass < handle
。来自 Mathworks Help page on clear
,
清除句柄图形句柄不会删除对象本身,删除对象也不会删除存储句柄的变量。
hf = figure; % Creates figure object, stores handle in variable hf
delete(hf) % Removes figure object, but not the variable hf
clear hf % Removes hf from the workspace; figure could still exist
所以clear
句柄对象不会将其从内存中删除,除非我先明确delete
..
我为myClass
指定了一个析构函数来进行适当的清理并删除一些对它的引用; {@ 1}}不会调用此析构函数。清除对象时是否可以调用该析构函数?
编辑:我应该提一下,如果没有对clear
对象的引用,delete
会自动调用clear
,我会有另一个类,比如说myClass
具有引用myOtherClass
的属性,例如myClass
。 myOtherClass.a
中还有其他属性不是myOtherClass
的属性,但如果myClass
也为空则它们应为空。如果这没有意义,请告诉我,这可能有点过于冗长。
答案 0 :(得分:11)
清除对句柄类对象的所有引用将从内存中删除它,并且在被销毁的对象上将自动调用delete
上的myClass
方法。这只是令人遗憾的令人困惑的术语。您的myClass
是“MCOS类”或“MCOS对象”,而不是help clear
所说的“句柄图形对象”。它们是不同的东西,至少在M代码级别。
句柄图形“对象”与myClass不是同一类型的“对象”,figure()
返回的“句柄图形句柄”与名为{{的类不同。 1}}你继承自。 handle
谈论“处理图形句柄”的那段话不适用于你的对象。请参阅help clear
并点击相关doco的doc handle
方法链接。
不要心疼; Matlab doco没有明确区分这些区别。 (IIRC它甚至没有明确使用术语“MCOS”;它只是将它们称为“对象”。)基本上,doco中“面向对象编程”部分下的材料与“对象”的类型相关, “处理”你正在处理delete
。 “图形”和“GUI开发”下的doco正在谈论另一种处理图形类型的“对象”和“句柄”。我认为他们对句柄图形内容使用术语“句柄”,对OOP内容使用“句柄类”。
要验证您的myClass
是否有效,只需进行一个简单的课程。
delete
然后创建一个并清除它。
classdef myClass < handle
methods
function delete(obj)
disp('delete was called');
end
end
end
如果未调用析构函数,则可能存在对象延迟的其他引用。每次清除保存对象引用的变量时,只有在清除了引用(或间接引用)的最后一个变量时,才会调用析构函数。