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

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

 Условия и Концепции

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

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

  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. Однако метод класса может вызвать метод 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

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

Похожие темы

Была ли эта тема полезной?