Несколько переменных могут ссылаться на один и тот же указатель объекта. Поэтому пользователи взаимодействуют с образцами классов 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