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