Класс Handle

Базовые знания

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

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

Жизненный цикл объекта

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

Синтаксис метода Handle Class Destructor

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

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

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

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

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

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.

Похожие темы