MATLAB在销毁句柄类的对象时调用该类的析构函数。MATLAB识别一个名为删除
作为类析构函数,只有在定义删除
作为一个普通的方法和适当的语法。
要成为有效的类析构函数,则删除
方法:
必须定义一个标量输入参数,它是类的对象。
不能定义输出参数
不可能密封的
,静态
,或摘要
此外,删除
方法应该不:
抛出错误,即使对象无效。
为要销毁的对象创建新句柄
子类的调用方法或访问属性
MATLAB不调用不合规函数删除
方法来销毁类的对象。A.删除
不是有效析构函数的方法会影响句柄基类删除
方法。一个不合格删除
方法可以通过阴影对象来防止对象的破坏手柄
类删除方法。
声明删除
一般方法:
方法函数删除(obj)%obj总是标量的...终止终止
MATLAB调用删除
方法分别用于数组中的每个元素删除
方法每次调用只传递一个标量参数。
使命感删除
在已删除的句柄上不应出现错误,并且不能执行任何操作。这种设计使删除
使用包含有效和无效对象混合的对象数组。
构造对象时发生的错误可能导致调用删除
在对象完全创建之前。因此,阶级删除
方法必须能够使用部分构造的对象。
例如,部分对象
班删除
方法确定数据
属性在访问此属性包含的数据之前为空。如果将构造函数参数分配给的名字
属性,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调用删除
销毁对象时,按以下顺序使用方法:
这个删除
对象类的方法
这个删除
每个超类的方法,从直接超类开始,并在层次结构中工作到最通用的超类
MATLAB调用删除
按照类定义中指定的顺序在层次结构中的同一级别上的超类的方法supclass1
之前supclass2
.MATLAB调用删除
方法supclass1
之前删除
方法supclass2
.
classdefmyClass < supclass1 & supclass2 . class
打完电话后删除
方法时,MATLAB将销毁只属于其方法被调用的类的属性值。销毁包含其他句柄对象的属性值可能导致调用删除
当这些对象没有其他引用时,这些对象的方法。
超类删除
方法不能调用属于子类的方法或访问属性。
考虑一组引用集合中其他对象的对象,这些引用形成一个循环图。在这种情况下,MATLAB:
如果仅在循环中引用对象,则销毁这些对象
只要存在来自循环外部MATLAB变量的任何对象的外部引用,则不会破坏对象
MATLAB按与构造相反的顺序销毁对象。
通过显式调用销毁句柄对象删除
关于对象:
删除(obj)
类可以通过设置对象的删除
方法通道
把某事归因于某人私有的
。但是,类的方法可以调用私有的
删除
方法。
如果类删除
方法通道
属性是受保护的
,只有类和子类的方法才能显式删除该类的对象。
但是,当对象生命周期结束时,MATLAB调用对象的删除
方法销毁对象时,无论该方法的通道
属性
类析构函数行为不同于重写方法的正常行为。MATLAB执行每个删除
方法,即使这样删除
方法不平民的
.
当您显式调用对象的删除
方法,MATLAB检查删除
方法通道
属性,但不在对象的超类中。具有私有的
删除
方法无法阻止子类对象的销毁。
声明私有删除方法对于密封类最有意义。在类未密封的情况下,子类可以通过公共访问定义自己的删除方法。MATLAB调用私有超类删除
方法作为显式调用公共子类的结果删除
方法。
类可以实现名为删除
这不是有效的类析构函数。MATLAB在销毁对象时不会隐式调用此方法。在这种情况下,删除
其行为与普通方法类似。
例如,如果超类实现了密封的
方法名为删除
这不是有效的析构函数,那么MATLAB不允许子类重写此方法。
A.删除
由值类定义的方法不能是类析构函数。
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对象的中间句柄对象。