主要内容

处理对象行为

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

有关句柄类的详细信息,请参见处理类

什么是句柄?

一些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)或其他变量。

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

中修改值myfunc

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

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

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

例如,modifySampleRate函数更改audioplayer采样率:

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

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

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

modifySampleRate函数不需要返回modifiedgongSound对象,因为audioplayer对象是句柄对象。

判断一个对象是否是句柄

的句柄对象的成员处理类。方法始终可以将对象标识为句柄isa函数。isa返回逻辑真正的1)当测试句柄变量时:

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

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

如果isa (gongSound“处理”&&是有效的(gongSound)...结束

删除句柄对象

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

例如,创建一个audioplayer对象:

负载FsygongSound = audioplayer(y,Fs);

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

删除(gongSound)

但是,handle变量仍然存在:

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

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

名称大小字节类属性Fs 1x1 8 double gongSound 1x1 0 audioplayer y 42028x1 336224 double

请注意

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

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

isvalid (gongSound)
Ans =逻辑0

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

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

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

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

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

要去掉变量,gongSound,使用清晰的

清晰的gongSound
名称大小字节类属性Fs 1x1 8 double y 42028x1 336224 double

相关的话题