Поведение объекта указатель

Несколько переменных могут ссылаться на один и тот же указатель объекта. Поэтому пользователи взаимодействуют с образцами классов handle по-другому, чем с образцами классов значений. Понимание поведения объектов handle может помочь вам определить, реализовывать ли указатель или класс значения. Эта тема иллюстрирует некоторые из этих взаимодействий.

Для получения дополнительной информации о классах Handle см. Классы Handle.

Что такое указатель?

Некоторые виды MATLAB® объекты являются handles. Когда переменная содержит указатель, она фактически содержит ссылку на объект.

Объекты указатель позволяют более чем одной переменной ссылаться на один и тот же объект. Поведение объекта Handle влияет на то, что происходит при копировании объектов указатель и при передаче их функциям.

Копии указателей

Все копии переменной объекта указателя относятся к одному и тому же базовому объекту. Это поведение ссылки означает, что если h определяет указатель объекта, затем,

h2 = h;

Создает другую переменную, h2, который относится к тому же объекту, что и h.

Для примера, MATLAB audioplayer функция создает объект указатель, который содержит данные источника аудио для воспроизведения определенного сегмента звука. Переменная, возвращенная audioplayer функция определяет аудио данных и позволяет вам получить доступ к объекту функциям для воспроизведения аудио.

MATLAB включает аудио данных, которые можно загрузить и использовать, чтобы создать audioplayer объект. Этот пример загружает аудио данных, создает аудиоплеер и воспроизводит аудио:

load gong Fs y
gongSound = audioplayer(y,Fs);
play(gongSound)

Предположим, что вы копируете gongSound указатель на объект другой переменной (gongSound2):

gongSound2 = gongSound;

Переменные gongSound и gongSound2 являются копиями одного и того же указателя и, следовательно, относятся к одному и тому же источнику звука. Доступ к audioplayer информацию, использующую обе переменные.

Для примера установите частоту дискретизации для источника звука гун путем присвоения нового значения SampleRate свойство. Сначала получите текущую частоту дискретизации, а затем установите новую частоту дискретизации:

sr = gongSound.SampleRate;
disp(sr)
8192
gongSound.SampleRate = sr*2;

Можно использовать gongSound2 для доступа к тому же аудиоисточнику:

disp(gongSound2.SampleRate)
16384

Воспроизведение звука гонга с новой частотой дискретизации:

play(gongSound2)

Указатели Объектов, измененные в функциях

Когда вы передаете аргумент в функцию, функция копирует переменную из рабочей области, в которой вы вызываете функцию, в переменную параметра в рабочей области функции.

Передача неширокой переменной функции не влияет на исходную переменную, которая находится в рабочей области вызывающего абонента. Для примера, myFunc изменяет локальную переменную, вызываемую var, но когда функция заканчивается, локальная переменная var больше не существует:

function myFunc(var)
   var = var + 1;
end

Задайте переменную и передайте ее в myfunc:

x = 12;
myFunc(x)

Значение x не изменился после выполнения myFunc(x):

disp(x)
12

The myFunc функция может вернуть измененное значение, которое можно присвоить тому же имени переменной (x) или другая переменная.

function out = myFunc(var)
   out = var + 1;
end

Измените значение в myfunc:

x = 12;
x = myFunc(x);
disp(x)
13

Когда аргумент является переменной handle, функция копирует только handle, а не объект, идентифицированный этим указателем. Оба указателя (оригинал и локальная копия) относятся к одному и тому же объекту.

Когда функция изменяет данные, на которые ссылается указатель на объект, эти изменения доступны из переменной handle в вызывающей рабочей области без необходимости возврата измененного объекта.

Для примера, modifySampleRate функция изменяет audioplayer частота дискретизации:

function modifySampleRate(audioObj,sr)
   audioObj.SampleRate = sr;
end

Создайте audioplayer объект и передать его в modifySampleRate функция:

load gong Fs y
gongSound = audioplayer(y,Fs);
disp(gongSound.SampleRate)
8192
modifySampleRate(gongSound,16384)
disp(gongSound.SampleRate)
16384

The modifySampleRate функции не нужно возвращать измененную gongSound объект из-за audioplayer объекты являются указателем объектами.

Определите, является ли объект указателем

Указатели объектов являются представителями из handle класс. Поэтому вы всегда можете идентифицировать объект как указатель, используя isa функция. isa возвращает логический true (1) при тестировании на переменную handle:

load gong Fs y
gongSound = audioplayer(y,Fs);
isa(gongSound,'handle')

Чтобы определить, является ли переменная допустимым указателем объекта, используйте isa и isvalid:

if isa(gongSound,'handle') && isvalid(gongSound)
   ...
end

Удаленные Указатели Объектов

Когда объект указателя был удален, указатель переменных, который ссылался на объект, все еще может существовать. Эти переменные становятся недопустимыми, поскольку объект, на который они ссылаются, больше не существует. Вызывающие delete объект удаляет объект, но не очищает переменные handle.

Для примера создайте audioplayer объект:

load gong Fs y
gongSound = audioplayer(y,Fs);

Выходной аргумент, gongSound, является переменной handle. Вызывающие delete удаляет объект вместе с содержащейся в нем аудиоисточником:

delete(gongSound)

Однако переменная handle все еще существует:

disp(gongSound)
handle to deleted audioplayer

whos команда показывает gongSound как audioplayer объект:

whos
  Name               Size             Bytes  Class          Attributes

  Fs                 1x1                  8  double                   
  gongSound          1x1                  0  audioplayer              
  y              42028x1             336224  double      

Примечание

Значение для байтов, возвращаемое whos команда не включает данные, на которые ссылается указатель, поскольку многие переменные могут ссылаться на одни и те же данные.

Указатель gongSound больше не ссылается на допустимый объект, как показано на isvalid метод handle:

isvalid(gongSound)
ans =

  logical

   0

Вызывающие delete на удаленном указателе ничего не делает и не вызывает ошибки. Можно передать массив, содержащий как допустимые, так и недопустимые указатели на delete. MATLAB удаляет допустимые указатели, но не выдает ошибку при обнаружении указателей, которые уже являются недопустимыми.

Вы не можете получить доступ к свойствам с недопустимой переменной handle:

gongSound.SampleRate
Invalid or deleted object.

Функции и методы, которые получают доступ к свойствам объекта, вызывают ошибку:

play(gongSound)
Invalid or deleted object.

Чтобы удалить переменную, gongSound, использование clear:

clear gongSound
whos
  Name          Size             Bytes  Class     Attributes

  Fs            1x1                  8  double              
  y         42028x1             336224  double   

Похожие темы