11

假设我有一堂课myClass < handle。在Mathworks 帮助页面上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

所以clearing 一个句柄对象不会将它从内存中删除,除非我delete首先明确它..

我指定了一个析构函数myClass来进行适当的清理并删除对它的一些引用;不调用此析构函数clear。当我的对象被清除时,是否可以调用该析构函数?

编辑:我应该提到,如果没有对对象的引用,delete则会自动调用 a ,但我有另一个类,比如引用 的属性,比如。另外还有其他属性不是 的属性,但如果也是空的,它们应该是空的。让我知道如果这没有意义,那可能有点太罗嗦了。clearmyClassmyOtherClassmyClassmyOtherClass.amyOtherClassmyClassmyOtherClass.a

4

1 回答 1

13

清除对句柄类对象的所有引用会将其从内存中删除,并且delete您的方法myClass将在对象被销毁时自动调用。不幸的是,这只是令人困惑的术语。您myClass是“MCOS 类”或“MCOS 对象”,而不是help clear正在谈论的“句柄图形对象”。它们是不同的东西,至少在 M 代码级别。

句柄图形“对象”与您的 myClass 的“对象”类型不同,并且返回的“句柄图形句柄”与您继承figure()的命名类不同。handle谈论“处理图形句柄”的那段话help clear不适用于您的对象。查看doc handle并按照链接获取delete相关文档的方法。

不要难过;Matlab doco 并没有把这些区别说得很清楚。(IIRC 它甚至没有明确使用术语“MCOS”;它只是称它们为“对象”。)基本上,文档中“面向对象编程”部分下的材料与“对象”的类型相关,并且“处理”您正在使用的myClass. “图形”和“GUI 开发”下的文档正在讨论另一种句柄图形类型的“对象”和“句柄”。我认为他们使用术语“句柄”来表示句柄图形的东西,而“句柄类”则表示 OOP 的东西。

要验证您的delete作品,只需制作一个简单的课程。

classdef myClass < handle
    methods
        function delete(obj)
        disp('delete was called');
        end
    end
end

然后创建一个并清除它。

>> x = myClass
x = 
  myClass handle with no properties.
  Methods, Events, Superclasses
>> clear x
delete was called
>> 

如果您的析构函数没有被调用,则可能有其他对对象的引用仍然存在。每次清除持有对该对象的引用的变量时,都不会调用析构函数,只有当最后一个持有引用(或间接引用)的变量被清除时。

于 2011-08-29T23:06:39.490 回答