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
класс удаляет метод.
delete
метод, заданный классом значения, который является совместимым указателем, не является деструктором, даже если delete
метод наследован подклассом указателя. Для получения информации об указателе совместимые классы смотрите Указатель Совместимые Классы.
Объявите 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 возвращает ошибку, когда вы пытаетесь инстанцировать класса, который задает Sealed
delete
метод.
Обычно, объявляя метод как 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
. Однако метод класса может вызвать 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 не позволяет подклассам заменять этот метод.
delete
метод, заданный классом значения, не может быть деструктором класса.
MATLAB не управляет объектными жизненными циклами, которые включают внешние языки, которые выполняют их собственное объектное управление жизненным циклом (иначе, сборка мусора). MATLAB не может обнаружить, когда безопасно уничтожить объекты, используемые в циклических ссылках, потому что внешняя среда не уведомляет MATLAB, когда внешняя ссылка была уничтожена.
Если вы не можете избежать внешних ссылок на объекты MATLAB, явным образом повредить циклическую ссылку путем уничтожения объектов в MATLAB.
Следующий раздел описывает, как справиться, эта ситуация при использовании Java® возражает тому ссылочному MATLAB объекты.
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 объекты.
Можно повредить эти циклические ссылки в различных способах:
Явным образом вызовите delete
на объектах MATLAB, когда они больше не необходимы
Не укажите коллбэки объекта Java тот ссылочный MATLAB объекты
Используйте промежуточные объекты указателя, что ссылка и коллбэки Java и MATLAB возражают.