Деструктор класса - метод с именем delete , который MATLAB ® вызывает неявно перед уничтожением объекта класса дескрипторов. Кроме того, пользовательский код может вызыватьdelete явно для уничтожения объекта.
Nondestructor - метод с именем delete не соответствует синтаксическим требованиям допустимого деструктора. Поэтому MATLAB не вызывает этот метод неявно при уничтожении объектов-дескрипторов. Метод с именем delete в классе значений не является деструктором. Метод с именем delete в классе значений, который устанавливает HandleCompatible атрибут для true не является деструктором.
MATLAB вызывает деструктор класса дескрипторов при уничтожении объектов класса. MATLAB распознает метод с именем delete как деструктор класса только при определении delete как обычный способ с соответствующим синтаксисом.
Чтобы быть допустимым деструктором класса, delete способ:
Должен определить один скалярный входной аргумент, который является объектом класса.
Не следует определять выходные аргументы
Не может быть Sealed, Static, или Abstract
Невозможно использовать arguments блоки для проверки входного аргумента.
Кроме того, delete метод не должен:
Выбрасывать ошибки, даже если объект недопустим.
Создание новых дескрипторов уничтожаемого объекта
Методы вызова или свойства доступа подклассов
MATLAB не вызывает несоответствие delete метод при уничтожении объектов класса. Несоответствующее delete способ может предотвратить разрушение объекта путем затенения handle метод удаления класса.
A delete метод, определенный классом значений, который совместим с дескриптором, не является деструктором, даже если delete метод наследуется подклассом дескриптора. Сведения о классах, совместимых с дескрипторами, см. в разделе Классы, совместимые с дескрипторами.
Объявить delete как обычный способ:
methods function delete(obj) % obj is always scalar ... end end
MATLAB вызывает delete отдельно для каждого элемента в массиве. Поэтому a delete метод передается только один скалярный аргумент с каждым вызовом.
Запрос delete для удаленного дескриптора не должно быть ошибок и не может предпринимать никаких действий. Эта конструкция позволяет delete для работы с массивами объектов, содержащими сочетание допустимых и недопустимых объектов.
delete Выполнение методаВызов delete метод на объекте всегда приводит к разрушению объекта. Объект уничтожается при вызове delete выполняется явно в коде MATLAB или при вызове MATLAB, поскольку объект больше не доступен ни из одной рабочей области. После вызова a delete метод не может прервать или предотвратить разрушение объекта.
A 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 или ошибки.
Если при построении класса дескриптора возникает ошибка, MATLAB вызывает деструктор класса для объекта вместе с деструкторами для любых объектов, содержащихся в свойствах, и любых инициализированных базовых классов.
Например, предположим, что метод открывает файл для записи и необходимо закрыть файл в delete способ. delete метод может вызывать fclose по идентификатору файла, хранящемуся в объекте FileID свойство:
function delete(obj) fclose(obj.FileID); end
При создании иерархии классов каждый класс может определить свой собственный delete способ. При уничтожении объекта MATLAB вызывает delete метод каждого класса в иерархии. Определение delete метод в handle подкласс не переопределяет handle класс delete способ. Подкласс delete методы увеличивают суперкласс delete методы.
Классы не могут определить допустимый деструктор, который является Sealed. MATLAB возвращает ошибку при попытке создания экземпляра класса, определяющего Sealed
delete способ.
Обычно, объявляя метод как Sealed запрещает подклассам переопределять этот метод. Тем не менее, Sealed метод с именем delete недопустимый деструктор не препятствует определению подклассом собственного деструктора.
Например, если суперкласс определяет метод с именем delete не является допустимым деструктором, но является Sealed, затем подклассы:
Может определять допустимые деструкторы (которые всегда именуются delete).
Не удается определить методы с именем delete недопустимые деструкторы.
Гетерогенные иерархии классов требуют, чтобы все методы, которым передаются гетерогенные массивы, должны быть запечатаны. Однако правило не применяется к методам деструктора классов. Поскольку методы деструктора не могут быть опечатаны, можно определить допустимый деструктор в гетерогенной иерархии, которая не опечатана, но функционирует как деструктор.
Сведения о гетерогенных иерархиях см. в разделе Проектирование иерархий гетерогенных классов.
MATLAB вызывает delete по завершении жизненного цикла объекта. Жизненный цикл объекта заканчивается, когда объект:
Больше нет ссылок где-либо
Явное удаление путем вызова delete на рукоятке
Жизненный цикл объекта, на который ссылается локальная переменная или входной аргумент, существует с момента назначения переменной до момента ее переназначения, удаления или отсутствия ссылки в этой функции или в любом массиве дескрипторов.
Переменная выходит из области действия при явном ее удалении или при завершении ее функции. Когда переменная выходит за пределы области действия и ее значение принадлежит классу дескриптора, определяющему 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. Однако метод класса может вызывать private
delete способ.
Если класс delete метод Access атрибут - protected, только методы класса и подклассов могут явно удалять объекты этого класса.
Однако когда жизненный цикл объекта заканчивается, MATLAB вызывает объект delete метод при уничтожении объекта независимо от метода Access атрибут.
Поведение деструктора класса отличается от нормального поведения переопределенного метода. MATLAB выполняет каждый delete метод каждого суперкласса при разрушении, даже если delete метод не является public.
при явном вызове объекта delete MATLAB проверяет delete метод Access в классе, определяющем объект, но не в суперклассах объекта. Суперкласс с private
delete метод не может предотвратить разрушение объектов подкласса.
Объявление частного метода удаления имеет наибольшее значение для запечатанных классов. В случае, когда классы не запечатаны, подклассы могут определять собственные методы удаления с открытым доступом. MATLAB вызывает частный суперкласс delete метод в результате явного вызова открытого подкласса delete способ.
Класс может реализовать метод с именем delete не является допустимым деструктором класса. MATLAB не вызывает этот метод неявно при уничтожении объекта. В этом случае delete ведет себя как обычный метод.
Например, если суперкласс реализует Sealed метод с именем delete , который не является допустимым деструктором, тогда MATLAB не позволяет подклассам переопределять этот метод.
A delete метод, определенный классом значений, не может быть деструктором класса.
MATLAB не управляет жизненными циклами объектов, в которых используются внешние языки, выполняющие собственное управление жизненным циклом объектов (или сбор мусора). MATLAB не может определить, когда безопасно уничтожать объекты, используемые в циклических ссылках, поскольку внешняя среда не уведомляет MATLAB о том, что внешние ссылки были уничтожены.
Если не удается избежать внешних ссылок на объекты MATLAB, явным образом разорвать циклическую ссылку, уничтожив объекты в MATLAB.
В следующем разделе описывается, как управлять этой ситуацией при использовании объектов Java ®, ссылающихся на объекты MATLAB.
Java не поддерживает деструкторы объектов, используемые объектами MATLAB. Поэтому важно управлять жизненным циклом всех объектов, используемых в приложениях, включающих объекты Java и MATLAB.
Объекты 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 classesWarning: 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.
Эти циклические привязки можно разорвать различными способами.
Явный вызов delete на объектах MATLAB, когда они больше не нужны
Отмена регистрации обратных вызовов объектов Java, ссылающихся на объекты MATLAB
Используйте промежуточные объекты-дескрипторы, которые ссылаются как на обратные вызовы Java, так и на объекты MATLAB.