Деструктор класса Handle

Элементарные знания

Class destructor – метод под названием delete тот MATLAB® вызовы неявно прежде, чем уничтожить объект класса Handle. Кроме того, пользовательский код может вызвать delete явным образом уничтожать объект.

Nondestructor – метод под названием delete это не удовлетворяет требования синтаксиса допустимого деструктора. Поэтому MATLAB не вызывает этот метод неявно при уничтожении объектов указателя. Метод под названием delete в значении класс не является деструктором. Метод под названием delete в классе значения, который устанавливает HandleCompatible припишите true не деструктор.

Объектный жизненный цикл

Атрибуты метода

Синтаксис метода деструктора класса Handle

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 методы в следующей последовательности при уничтожении объекта:

  1. delete метод для класса объекта

  2. 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, явным образом повредить циклическую ссылку путем уничтожения объектов в MATLAB.

Следующий раздел описывает, как управлять этой ситуацией при использовании Java® объекты тот ссылочный MATLAB объекты.

Ссылки Java могут предотвратить выполнение деструктора

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 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 возражают.

Похожие темы