文档

句柄类析构函数

基础知识

术语和概念

句柄类析构函数方法的语法

MATLAB在销毁句柄类的对象时调用该类的析构函数。MATLAB识别一个名为删除作为类析构函数,只有在定义删除作为一个普通的方法和适当的语法。

要成为有效的类析构函数,则删除方法:

  • 必须定义一个标量输入参数,它是类的对象。

  • 不能定义输出参数

  • 不可能密封的,静态,或摘要

此外,删除方法应该:

  • 抛出错误,即使对象无效。

  • 为要销毁的对象创建新句柄

  • 子类的调用方法或访问属性

MATLAB不调用不合规函数删除方法来销毁类的对象。A.删除不是有效析构函数的方法会影响句柄基类删除方法。一个不合格删除方法可以通过阴影对象来防止对象的破坏手柄类删除方法。

声明删除一般方法:

方法函数删除(obj)%obj总是标量的...终止终止

delete在数组上调用元素- wise

MATLAB调用删除方法分别用于数组中的每个元素删除方法每次调用只传递一个标量参数。

使命感删除在已删除的句柄上不应出现错误,并且不能执行任何操作。这种设计使删除使用包含有效和无效对象混合的对象数组。

万博1manbetx支持部分构造对象的销毁

构造对象时发生的错误可能导致调用删除在对象完全创建之前。因此,阶级删除方法必须能够使用部分构造的对象。

例如,部分对象删除方法确定数据属性在访问此属性包含的数据之前为空。如果将构造函数参数分配给的名字属性,MATLAB传递部分构造的对象以删除。

classdefPartialObject <处理属性%限制Name属性%到单元格数组名称单元格数据终止方法函数h=部分对象(名称)如果nargin>0 h.Name=Name;h.Data.a=rand(10,1);终止终止函数删除(h)%防止访问属性%部分构造对象的定义如果~isempty(h.Data) t = h.Data.a;disp (t)其他的disp(“数据为空”)终止终止终止终止

如果使用烧焦向量,而不是所需的单元格数组:

obj = PartialObject (“测试”)

MATLAB将部分构造的对象传递给删除方法constructor did not set the value of the数据属性,因为设置的名字所有物

数据是空的设置“PartialObject”类的“Name”属性错误:

何时定义析构函数方法

使用删除方法在MATLAB销毁对象之前执行清理操作删除方法,即使执行因Ctrl-c或错误而中断。

如果在句柄类的构造过程中发生错误,MATLAB将调用对象上的类析构函数,以及属性中包含的任何对象的析构函数和任何初始化基类的析构函数。

例如,假设一个方法打开一个要写入的文件,而您想在您的删除方法删除方法可以调用文件关闭对象存储在其文件标识属性:

函数删除(obj)fclose(obj.FileID);终止

类层次结构中的析构函数

如果创建类的层次结构,则每个类都可以定义自己的类删除方法。当销毁对象时,MATLAB调用删除层次结构中每个类的方法。定义删除a中的方法手柄子类不重写手柄删除方法子类删除方法扩充超类删除方法。

继承密封的删除方法

类无法定义有效的析构函数密封的.MATLAB在尝试实例化定义密封的删除方法。

通常,将方法声明为密封的防止子类重写该方法。然而,一个密封的方法名为删除这不是有效的析构函数,但不会阻止子类定义自己的析构函数。

例如,如果一个超类定义了一个名为删除这不是有效的析构函数,但是密封的,然后是子类:

  • 可以定义有效的析构函数(始终命名为删除).

  • 无法定义名为的方法删除无效析构函数。

异构层次结构中的析构函数

异构类层次结构要求传递给异构数组的所有方法必须是密封的。然而,该规则不适用于类析构函数方法。因为析构函数方法不能被密封,所以可以在异构层次结构中定义一个有效的析构函数,该析构函数不是密封的,但可以作为析构函数发挥作用。

有关异构层次结构的信息,请参见设计异构类层次结构

对象生命周期

MATLAB调用删除方法。对象的生命周期在以下情况下结束:

  • 不再在任何地方引用

  • 通过调用删除在把手上

函数内部

由局部变量或输入参数引用的对象的生命周期从分配变量开始,一直存在到在该函数或任何句柄数组中重新分配、清除或不再引用该变量为止。

当您显式清除某个变量或其函数结束时,该变量将超出范围。当变量超出范围且其值属于定义删除方法,MATLAB调用该方法。MATLAB不定义函数中变量之间的顺序。当同一函数包含多个值时,不要假设MATLAB先破坏一个值,再破坏另一个值。

句柄对象销毁期间的序列

MATLAB调用删除销毁对象时,按以下顺序使用方法:

  1. 这个删除对象类的方法

  2. 这个删除每个超类的方法,从直接超类开始,并在层次结构中工作到最通用的超类

MATLAB调用删除按照类定义中指定的顺序在层次结构中的同一级别上的超类的方法supclass1之前supclass2.MATLAB调用删除方法supclass1之前删除方法supclass2

classdefmyClass < supclass1 & supclass2 . class

打完电话后删除方法时,MATLAB将销毁只属于其方法被调用的类的属性值。销毁包含其他句柄对象的属性值可能导致调用删除当这些对象没有其他引用时,这些对象的方法。

超类删除方法不能调用属于子类的方法或访问属性。

循环引用对象的销毁

考虑一组引用集合中其他对象的对象,这些引用形成一个循环图。在这种情况下,MATLAB:

  • 如果仅在循环中引用对象,则销毁这些对象

  • 只要存在来自循环外部MATLAB变量的任何对象的外部引用,则不会破坏对象

MATLAB按与构造相反的顺序销毁对象。

限制对对象删除方法的访问

通过显式调用销毁句柄对象删除关于对象:

删除(obj)

类可以通过设置对象的删除方法通道把某事归因于某人私有的。但是,类的方法可以调用私有的删除方法。

如果类删除方法通道属性是受保护的,只有类和子类的方法才能显式删除该类的对象。

但是,当对象生命周期结束时,MATLAB调用对象的删除方法销毁对象时,无论该方法的通道属性

继承私有删除方法

类析构函数行为不同于重写方法的正常行为。MATLAB执行每个删除方法,即使这样删除方法不平民的

当您显式调用对象的删除方法,MATLAB检查删除方法通道属性,但不在对象的超类中。具有私有的删除方法无法阻止子类对象的销毁。

声明私有删除方法对于密封类最有意义。在类未密封的情况下,子类可以通过公共访问定义自己的删除方法。MATLAB调用私有超类删除方法作为显式调用公共子类的结果删除方法。

非破坏性删除方法

类可以实现名为删除这不是有效的类析构函数。MATLAB在销毁对象时不会隐式调用此方法。在这种情况下,删除其行为与普通方法类似。

例如,如果超类实现了密封的方法名为删除这不是有效的析构函数,那么MATLAB不允许子类重写此方法。

A.删除由值类定义的方法不能是类析构函数。

Java对象引用MATLAB物体

Java®不支持MATLAB万博1manbetx对象使用的对象析构函数。因此,管理应用程序中使用的所有对象(包括Java和MATLAB对象)的生命周期非常重要。

引用可以阻止析构函数的执行

持有对MATLAB对象的引用的Java对象可以防止删除MATLAB对象。在这些情况下,MATLAB不调用句柄对象删除方法,即使没有引用该对象的句柄变量。确保你的删除方法执行时,调用删除在句柄变量超出作用域之前,显式地调用对象。

当您为引用MATLAB对象的Java对象定义回调时,可能会出现问题。

例如,Java回调类创建一个Javacom.mathworks.jmi.Callback对象,并将类方法赋给回调函数。结果是一个Java对象,该对象通过函数-句柄回调具有对句柄对象的引用。

classdefCallbackWithJava方法函数obj=CallbackWithJava jo=com.mathworks.jmi.Callback;set(jo,“延迟回调”,@obj.cbFunc);%将方法指定为回调jo.postCallback终止函数cbFunc(obj,varargin)c=类(obj);disp([“类上的Java对象回调”,c])终止函数Delete (obj) c = class(obj);disp (['为类调用ML对象析构函数',c])终止终止终止

假设您创建了一个Java回调函数中的对象:

函数test析构函数cwj = CallbackWithJava...终止

创建Java回调类创建com.mathworks.jmi.Callback对象并执行回调函数:

testDestructor
cwj = CallbackWithJava没有属性。类CallbackWithJava上的Java对象回调

句柄变量,cwj,只存在于功能工作区中。然而,MATLAB并不调用该类删除函数结束时使用com.mathworks.jmi.Callback对象仍然存在,并保留对Java回调类,防止破坏MATLAB对象。

清楚的
警告:'CallbackWithJava'类的对象存在。无法清除该类或其任何超类。

为了避免造成无法访问的对象,请在丢失MATLAB对象的句柄之前显式调用delete。

函数test析构函数cwj = CallbackWithJava...删除(cwj)终止

管理应用程序中的对象生命周期

使用Java对象的MATLAB应用程序应该管理相关对象的生命周期。典型的用户界面应用程序从MATLAB对象引用Java对象,并对引用MATLAB对象的Java对象创建回调。

可以通过多种方式断开这些循环引用:

  • 当不再需要MATLAB对象时,显式地调用delete

  • 取消注册引用MATLAB对象的Java对象回调

  • 使用同时引用Java回调和MATLAB对象的中间句柄对象。

相关的话题

这个话题有用吗?