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
должен смочь работать с частично созданными объектами.
Например, класс 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.
Чтобы постараться не вызывать недоступные объекты, вызовите удаление явным образом прежде, чем потерять указатель на объект MATLAB.
function testDestructor cwj = CallbackWithJava ... delete(cwj) end
Приложения MATLAB, которые используют объекты Java, должны управлять жизненным циклом включенных объектов. Типичный Java ссылок приложения пользовательского интерфейса возражает от MATLAB, возражает и создает обратные вызовы на объектах Java тот ссылочный MATLAB объекты.
Можно повредить эти циклические ссылки в различных способах:
Явным образом вызов удаляет на объектах MATLAB, когда они больше не необходимы
Не укажите обратные вызовы объекта Java тот ссылочный MATLAB объекты
Используйте промежуточные объекты указателя, что ссылка и обратные вызовы Java и MATLAB возражают.