主要内容

处理对象的行为

多个变量可以引用同一个句柄对象。因此,用户与句柄类实例的交互不同于与值类实例的交互。理解句柄对象的行为可以帮助您确定是实现句柄类还是值类。本主题说明了其中的一些交互作用。

有关句柄类的更多信息,请参见处理类

什么是手柄?

一些MATLAB®对象是处理.当一个变量持有一个句柄时,它实际上持有对该对象的引用。

句柄对象允许多个变量引用同一个对象。句柄对象行为影响复制句柄对象和将它们传递给函数时所发生的事情。

处理的副本

句柄对象变量的所有副本引用相同的基础对象。这种引用行为意味着如果h标识句柄对象,则,

h2 = h;

创建另一个变量,h2,指的是同一个物体h

例如,MATLABaudioplayer函数创建一个句柄对象,该对象包含用于再现特定声音段的音频源数据。函数返回的变量audioplayer函数标识音频数据,并使您能够访问对象函数来播放音频。

MATLAB软件包括音频数据,您可以加载和使用创建audioplayer对象。这个示例加载音频数据,创建音频播放器,并播放音频:

负载FsygongSound = audioplayer (y, Fs);玩(gongSound)

假设你复制gongSound对象句柄指向另一个变量(gongSound2):

gongSound2 = gongSound;

的变量gongSoundgongSound2是相同句柄的副本,因此,引用相同的音频源。访问audioplayer使用任一变量的信息。

例如,设置锣音频源的采样率通过分配一个新值SampleRate财产。首先得到当前的采样率,然后设置一个新的采样率:

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

您可以使用gongSound2访问相同的音频源:

disp (gongSound2.SampleRate)
16384

演奏锣的声音与新的采样率:

玩(gongSound2)

句柄对象在函数中修改

当向函数传递参数时,函数会将变量从调用函数的工作空间复制到函数工作空间中的参数变量。

将非句柄变量传递给函数不会影响调用者工作空间中的原始变量。例如,myFunc修改被调用的局部变量var,但当函数结束时,局部变量var不再存在:

函数myFunc(var) var = var + 1;结束

定义一个变量并将其传递给myfunc

x = 12;myFunc (x)

的价值x执行后没有改变myFunc (x)

disp (x)
12

myFunc函数可以返回修改后的值,您可以将该值赋给相同的变量名(x)或另一个变量。

函数out = myFunc(var) out = var + 1;结束

修改myfunc

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

当参数是句柄变量时,函数只复制句柄,而不复制由该句柄标识的对象。两个句柄(原始句柄和本地句柄)引用同一个对象。

当函数修改对象句柄引用的数据时,可以从调用工作区中的句柄变量访问这些更改,而不需要返回修改后的对象。

例如,modifySampleRate功能的变化audioplayer采样率:

函数audioObj modifySampleRate (audioObj sr)。SampleRate =老;结束

创建一个audioplayer对象,并将其传递给modifySampleRate功能:

负载FsygongSound = audioplayer (y, Fs);disp (gongSound.SampleRate)
8192
modifySampleRate (gongSound 16384) disp (gongSound.SampleRate)
16384

modifySampleRate函数不需要返回修改过的gongSound对象,因为audioplayer对象是句柄对象。

确定一个对象是否为句柄

类的成员处理类。因此,您总是可以使用isa函数。isa返回逻辑真正的1)在测试句柄变量时:

负载FsygongSound = audioplayer (y, Fs);isa (gongSound“处理”

要确定一个变量是否是一个有效的句柄对象,请使用isaisvalid

如果isa (gongSound“处理”) & & (gongSound)是否是可用的。...结束

删除处理对象

当句柄对象被删除时,引用该对象的句柄变量仍然存在。这些变量变得无效,因为它们引用的对象不再存在。调用删除在对象上删除对象,但不清除句柄变量。

例如,创建audioplayer对象:

负载FsygongSound = audioplayer (y, Fs);

输出参数,gongSound,是一个句柄变量。调用删除删除对象及其包含的音频源信息:

删除(gongSound)

然而,句柄变量仍然存在:

disp (gongSound)
删除音频播放器的句柄

命令显示了gongSound作为一个audioplayer对象:

Name Size Bytes Class Attributes Fs 1x1 8 double gongSound 1x1 0 audioplayer y 42028x1 336224 double

请注意

属性返回的Bytes的值命令不包含句柄引用的数据,因为许多变量可以引用相同的数据。

句柄gongSound不再引用有效对象,如isvalid处理方法:

isvalid (gongSound)
逻辑0

调用删除对已删除句柄不做任何操作,也不会导致错误。可以将包含有效句柄和无效句柄的数组传递给删除.MATLAB删除有效句柄,但在遇到已经无效的句柄时不会发出错误。

你不能用无效的句柄变量访问属性:

gongSound。SampleRate
无效或已删除的对象。

访问对象属性的函数和方法导致错误:

玩(gongSound)
无效或已删除的对象。

要删除该变量,gongSound,使用清晰的

清晰的gongSound
Name Size Bytes Class Attributes Fs 1x1 8 double y 42028x1 336224 double

相关的话题