Class destructor – метод под названием delete
, который MATLAB® вызывает неявно прежде, чем уничтожить объект класса Handle. Кроме того, пользовательский код может вызвать delete
явным образом, чтобы уничтожить объект.
Nondestructor – метод под названием delete
, который не удовлетворяет требования синтаксиса допустимого деструктора. Поэтому MATLAB не вызывает этот метод неявно при уничтожении объектов указателя. Метод под названием delete
в классе значения не является деструктором. Метод под названием delete
в классе значения, который устанавливает атрибут HandleCompatible
на true
, не является деструктором.
MATLAB вызывает деструктор класса Handle при уничтожении объектов класса. MATLAB распознает метод под названием delete
как деструктор класса, только если вы задаете delete
как обычный метод с соответствующим синтаксисом.
Быть допустимым деструктором класса, методом delete
:
Должен задать один, скалярный входной параметр, который является объектом класса.
Не должен задавать выходные аргументы
Не может быть Sealed
, Static
или Abstract
Кроме того, метод delete
не должен:
Выдайте ошибки, даже если объект недопустим.
Создайте новые указатели на уничтожаемый объект
Вызовите методы или свойства доступа подклассов
MATLAB не вызывает несовместимый метод delete
при уничтожении объектов класса. Метод delete
, который не является допустимым деструктором тени базовый класс указателя метод delete
. Несовместимый метод delete
может предотвратить разрушение объекта затенением, класс handle
удаляет метод.
Объявите delete
как обычный метод:
methods function delete(obj) % obj is always scalar ... end end
MATLAB вызывает метод delete
отдельно для каждого элемента в массиве. Поэтому метод delete
передается только один скалярный аргумент с каждым вызовом.
Вызов delete
на удаленном указателе не должен ошибка и не может принять меры. Этот проект позволяет delete
работать над массивами объектов, содержащими соединение доступных и недопустимых объектов.
delete
Вызов метода delete
на объекте всегда приводит к разрушению объекта. Объект уничтожается, когда вызов delete
выполняется явным образом в коде MATLAB или, когда названо MATLAB, потому что объект более не достижим из любой рабочей области. После того, как названный, метод delete
не может прервать или предотвратить объектное разрушение.
Метод delete
может получить доступ к свойствам удаляемого объекта. MATLAB не уничтожает эти свойства до окончания методов delete
для класса объекта, и все суперклассы закончили выполняться.
Если метод delete
создает новые переменные, которые содержат указатель на удаляемый объект, те указатели недопустимы. После выполнения концов метода delete
указатели на удаленный объект в любых переменных в любой рабочей области недопустимы.
Метод isvalid
возвращает false
для объекта указателя в рамках метода delete
, потому что объектное разрушение начинается, когда метод называется.
MATLAB вызывает методы delete
в инверсии порядка конструкции. Таким образом, MATLAB вызывает, разделяют на подклассы методы delete
перед суперклассом методы delete
.
Если суперкласс ожидает свойство быть управляемым подклассами, то суперкласс не должен получать доступ к тому свойству в своем методе delete
. Например, если подкласс использует наследованное абстрактное свойство сохранить указатель на объект, то подкласс должен уничтожить этот объект в своем методе delete
, но суперкласс не должен получать доступ к тому свойству в своем методе delete
.
Ошибки, которые происходят при построении объекта, могут привести к вызову delete
, прежде чем объект будет полностью создан. Поэтому класс методы delete
должен смочь работать с частично созданными объектами.
Например, класс PartialObject
, который определяет метод delete
, пусто ли свойство Data
прежде, чем получить доступ к данным это свойство, содержит. Если ошибка происходит при присвоении аргумента конструктора свойству Name
, MATLAB передает частично созданный объект удалить.
classdef PartialObject < handle properties % Restrict the Name property % to a cell array Name cell Data end methods function h = PartialObject(name) if nargin > 0 h.Name = name; h.Data.a = rand(10,1); end end function delete(h) % Protect against accessing properties % of partially constructed objects if ~isempty(h.Data) t = h.Data.a; disp(t) else disp('Data is empty') end end end end
Ошибка происходит, если вы вызываете конструктора с вектором char
вместо необходимого массива ячеек:
obj = PartialObject('Test')
MATLAB передает частично созданный объект методу delete
. Конструктор не устанавливал значение свойства Data
, потому что ошибка произошла при установке свойства Name
.
Data is empty
Error setting 'Name' property of 'PartialObject' class:
...
Используйте метод delete
, чтобы выполнить операции очистки, прежде чем MATLAB уничтожит объект. MATLAB вызывает метод delete
надежно, даже если выполнение прервано с Ctrl-c или ошибкой.
Если ошибка происходит во время конструкции класса Handle, MATLAB вызывает деструктор класса на объекте наряду с деструкторами для любых объектов, содержавшихся в свойствах и любых инициализированных базовых классов.
Например, предположите, что метод открывает файл для записи, и вы хотите закрыть файл в своем методе delete
. Метод delete
может вызвать fclose
на идентификаторе файла что объектно-ориентированная память в его свойстве FileID
:
function delete(obj) fclose(obj.FileID); end
Если вы создаете иерархию классов, каждый класс может задать свой собственный метод delete
. При уничтожении объекта MATLAB вызывает метод delete
каждого класса в иерархии. Определение метода delete
в подклассе handle
не заменяет класс handle
метод delete
. Разделите на подклассы приращение методов delete
суперкласс методы delete
.
Классы не могут задать допустимый деструктор, который является Sealed
. MATLAB возвращает ошибку, когда вы пытаетесь инстанцировать класса, который задает
метод delete
Sealed
.
Обычно, объявляя метод, когда Sealed
препятствует тому, чтобы подклассы заменили тот метод. Однако метод Sealed
под названием delete
, который не является допустимым деструктором, не препятствует тому, чтобы подкласс задал свой собственный деструктор.
Например, если суперкласс задает метод под названием delete
, который не является допустимым деструктором, но является Sealed
, затем разделяет на подклассы:
Может задать допустимые деструкторы (которые всегда называют delete
).
Не может задать методы под названием delete
, которые не являются допустимыми деструкторами.
Неоднородные иерархии классов требуют, чтобы были изолированы все методы, которым передаются разнородные массивы. Однако правило не применяется к методам деструктора класса. Поскольку методы деструктора не могут быть изолированы, можно задать допустимый деструктор в неоднородной иерархии, которая не изолируется, но действительно функционирует как деструктор.
Для получения информации о неоднородных иерархиях смотрите Разрабатывающие Неоднородные Иерархии классов
MATLAB вызывает метод delete
, когда жизненный цикл объекта заканчивается. Жизненный цикл объекта заканчивается, когда объект:
Больше ссылаемый где угодно
Явным образом удаленный путем вызова delete
на указателе
Жизненный цикл объекта, на который ссылается локальная переменная или входной параметр, существует со времени, переменная присвоена до времени это повторно присвоено, очищено, или больше не ссылается в этой функции или ни в каком массиве указателя.
Переменная выходит из осциллографа, когда вы явным образом очищаете его или когда его функция заканчивается. Когда переменная выходит из осциллографа, и его значение принадлежит классу Handle, который задает метод delete
, MATLAB вызывает тот метод. MATLAB не задает упорядоченного расположения среди переменных в функции. Не принимайте, что MATLAB уничтожает одно значение перед другим значением, когда та же функция содержит несколько значений.
MATLAB вызывает методы delete
в следующей последовательности при уничтожении объекта:
Метод delete
для класса объекта
Метод delete
каждого класса суперкласса, начиная с мгновенных суперклассов и обрабатывания иерархии к самым общим суперклассам
MATLAB вызывает методы delete
суперклассов на том же уровне в иерархии в порядке, заданном в определении класса. Например, следующее определение класса задает supclass1
перед supclass2
. MATLAB вызывает метод delete
supclass1
перед методом delete
supclass2
.
classdef myClass < supclass1 & supclass2
После вызова каждого метода delete
MATLAB уничтожает значения свойств, принадлежащие исключительно классу, метод которого был назван. Разрушение значений свойств, которые содержат другие объекты указателя, может вызвать вызов методы delete
для тех объектов, когда нет никаких других ссылок на те объекты.
Суперкласс методы delete
не может вызвать методы или свойства доступа, принадлежащие подклассу.
Рассмотрите набор объектов, которые ссылаются на другие объекты набора, таким образом, что ссылки формируют циклический график. В этом случае, MATLAB:
Уничтожает объекты, если на них ссылаются только в цикле
Не уничтожает объекты, пока существует внешняя ссылка на любой из объектов от переменной MATLAB вне цикла
MATLAB уничтожает объекты в реверсе порядка конструкции. для получения дополнительной информации смотрите, что Объект Указателя Во время удаляет Осуществление Метода.
Уничтожьте объекты указателя путем явного вызова delete
на объекте:
delete(obj)
Класс может предотвратить явное разрушение объекта путем установки его метода delete
атрибут Access
на private
. Однако метод класса может вызвать
метод delete
private
.
Если класс метод delete
, атрибутом Access
является protected
, только методы класса и подклассов, может явным образом удалить объекты того класса.
Однако, когда объектный жизненный цикл заканчивается, MATLAB вызывает метод delete
объекта при уничтожении объекта независимо от атрибута Access
метода.
Поведение деструктора класса отличается от нормального поведения переопределенного метода. MATLAB выполняет каждый метод delete
каждого суперкласса после разрушения, даже если, что методом delete
не является public
.
Когда вы явным образом вызываете метод delete
объекта, MATLAB проверяет метод delete
атрибут Access
в класс, задающий объект, но не в суперклассы объекта. Суперкласс с
методом delete
private
не может предотвратить разрушение объектов подкласса.
Объявление частного удаляет метод, имеет большую часть смысла для запечатанных классов. В случае, где классы не изолируются, подклассы могут задать свое собственное, удаляют методы с открытым доступом. MATLAB вызывает частный суперкласс метод delete
в результате явного вызова общедоступного подкласса метод delete
.
Класс может реализовать метод под названием delete
, который не является допустимым деструктором класса. MATLAB не вызывает этот метод неявно при уничтожении объекта. В этом случае delete
ведет себя как обычный метод.
Например, если суперкласс реализует метод Sealed
под названием delete
, который не является допустимым деструктором, затем MATLAB не позволяет подклассам заменять этот метод.
Метод delete
, заданный классом значения, не может быть деструктором класса.
Java® не поддерживает объектные деструкторы, что MATLAB возражает использованию. Поэтому важно управлять жизненным циклом всех объектов, используемых в приложениях, которые включают и объекты MATLAB и Java.
Объекты Java, которые содержат ссылки на объекты MATLAB, могут предотвратить удаление объектов MATLAB. В этих случаях MATLAB не вызывает метод объекта delete
указателя, даже когда нет никакой переменной указателя, относящейся к тому объекту. Гарантировать ваш метод delete
выполняется, вызовите delete
на объекте явным образом, прежде чем переменная указателя выйдет из осциллографа.
Проблемы могут произойти, когда вы задаете коллбэки для объектов Java тот ссылочный MATLAB объекты.
Например, класс CallbackWithJava
создает объект Java com.mathworks.jmi.Callback
и присваивает метод класса как функцию обратного вызова. Результатом является объект Java, который имеет ссылку на объект указателя через коллбэк указателя на функцию.
classdef CallbackWithJava < handle methods function obj = CallbackWithJava jo = com.mathworks.jmi.Callback; set(jo,'DelayedCallback',@obj.cbFunc); % Assign method as callback jo.postCallback end function cbFunc(obj,varargin) c = class(obj); disp(['Java object callback on class ',c]) end function delete(obj) c = class(obj); disp(['ML object destructor called for class ',c]) end end end
Предположим, что вы создаете объект CallbackWithJava
из функции:
function testDestructor cwj = CallbackWithJava ... end
Создание экземпляра класса CallbackWithJava
создает объект com.mathworks.jmi.Callback
и выполняет функцию обратного вызова:
testDestructor
cwj = CallbackWithJava with no properties. Java object callback on class CallbackWithJava
Переменная указателя, cwj
, существует только в функциональной рабочей области. Однако MATLAB не вызывает класс метод delete
, когда функция заканчивается. Объект com.mathworks.jmi.Callback
все еще существует и содержит ссылку на объект класса CallbackWithJava
, который предотвращает разрушение объекта MATLAB.
clear classes
Warning: Objects of 'CallbackWithJava' class exist. Cannot clear this class or
any of its superclasses.
Чтобы постараться не вызывать недоступные объекты, вызовите delete
явным образом прежде, чем потерять указатель на объект MATLAB.
function testDestructor cwj = CallbackWithJava ... delete(cwj) end
Приложения MATLAB, которые используют объекты Java, должны управлять жизненным циклом включенных объектов. Java ссылок приложения интерфейса типичного пользователя возражает из MATLAB, возражает и создает коллбэки на объектах Java тот ссылочный MATLAB объекты.
Можно повредить эти циклические ссылки в различных способах:
Явным образом вызов удаляет на объектах MATLAB, когда они больше не необходимы
Не укажите коллбэки объекта Java тот ссылочный MATLAB объекты
Используйте промежуточные объекты указателя, что ссылка и коллбэки Java и MATLAB возражают.