罗兰在MATLAB的艺术

把想法变成MATLAB

理解对象清理

今天我想介绍一个嘉宾博客哈达德尼克,开发人员在Mathworks工作在MATLAB音频和视频相关的特性。今天他谈到清洁
了在MATLAB中不同类型的对象。

内容

介绍

有一天我读一本帖子关于声卡从优秀的新光谱分析iheartmatlab博客。除了一篇很棒的文章从声卡录音,作者涉及对象生命周期,遇到了一个问题
在过去绊倒我。

所以,今天我想讨论两种类型的对象在MATLAB中,作用域的对象和用户管理的对象。知道哪个
类型的对象你处理可以避免各种各样的混乱。让我们先从一个小例子。

录制音频和一个回调

假设你想要使用audiorecorder从你的声卡对象记录一些音频。audiorecorder有财产TimerFcn,它允许您指定一个回调函数。这个回调函数调用一个函数时指定记录音频。这里有一个例子函数。

函数makeRecorder (timerCallback, timerPeriod)%创建一个录音机对象recObject = audiorecorder ();%安装每“timerPeriod”秒调用回调集(recObject,“TimerFcn”timerCallback,“TimerPeriod”,timerPeriod);%开始记录记录(recObject);结束

一旦记录开始,函数timerCallback就是每一个timerPeriod秒。这可以方便检查音频数据流。

从表面上看makeRecorder函数看起来是准备好运行。但是,有一个微妙导致该函数不像预期的那样工作。当
makeRecorder函数结束时,recObject变量超出范围,从工作区中删除,清理自己。对于一个audiorecorder对象,清理的意思是:

  • 停止记录
  • 删除安装定时器回调
  • 删除所有audiorecorder数据从内存

在这种情况下,timerCallback从来都不是因为当makeRecorder结束后,记录立即停止并关闭audiorecorder的计时器。

对象是清理的原因是因为的一生audiorecorder对象是受它的范围。保持对象活着你需要复制对象的局部变量的makeRecorder函数。

函数recObject = makeRecorderBetter (timerCallback timerPeriod)%创建一个录音机对象recObject = audiorecorder ();%安装每“timerPeriod”秒调用回调集(recObject,“TimerFcn”timerCallback,“TimerPeriod”,timerPeriod);%开始记录记录(recObject);结束

现在recObject将在工作区中调用的代码吗makeRecorder,让audiorecorder为了生存。

作用域的对象和用户管理的对象

audiorecorder对象我喜欢称之为一个作用域的对象,因为它运行后会自己清除超出范围。作用域的对象
在MATLAB是最常见的类型的对象。他们的行为就像普通标量和矩阵变量。

%创建和清晰的一个标量z =罪(π);清晰的z;%创建和明确3 x 3矩阵M =魔法(3);清晰的;% timeseries对象创建和清楚t = timeseries ();清晰的t;

清理timeseries对象删除以上timeseries完全从内存中,就像清理一个标量或矩阵变量。

的原因makeRecorder上面的例子可以令人困惑的是,一些对象在MATLAB清理自己当他们走出范围,和一些不喜欢。
如果你用一个计时器相同类型的对象,结果是非常不同的。

函数挤出时间(timerCallback) timerObject =计时器(“TimerFcn”timerCallback,“时间”,0.25,“ExecutionMode”,“fixedSpacing”);开始(timerObject);结束

在这个示例中,变量timerObject超出范围的尽头挤出时间,但计时器得到清理。所以,每0.25秒计时器火灾和回调函数timerCallback适当地叫。让我们来测试它。

%创建一个计时器挤出时间(@ (obj、事件)([obj.Name显示“发射”)));%停顿一秒钟让计时器暂停(1);
timer-1解雇timer-1解雇timer-1解雇timer-1解雇

你可以看到在一秒计时器解雇了4次,即使我不再能定时器对象创建。

定时器对象是我喜欢称之为用户管理的对象,在他们不清理自己。你是负责任的
清理一个计时器通过调用删除方法用计时器后。

但是,后挤出时间结束后,timerObject变量不再是在工作区中,所以您将需要使用找到它timerfind函数。

%找到所有杰出的计时器计时器= timerfind ();%停止计时器你发现停止(计时器);%删除和清除计时器删除(计时器);清晰的计时器;

为什么用户管理的对象存在吗?

使用一个用户管理的对象似乎是额外的工作,但是得到的灵活性/对象的表达语言,因为它一生
可以保持在无论一个变量的范围。这可能是非常有用的在一些情况下,比如当你的建筑
gui。例如,您可以创建一个定时器对象CreateFcn图窗口的刷新图每一秒中,然后清理计时器的图DeleteFcn

还有,如果你正在与一个用户管理的对象,并想把它当作一个作用域对象,您可以使用onCleanup,这是在R2008a引入。看看以前的文章,包括罗兰onCleanup,让事情整洁

作用域或用户管理的?

用户管理的对象包括MATLAB有很大的不同计时器,analoginput,videoinput等等。这些都有对应的找到函数来帮助你找到对象从工作区中删除,但仍徘徊在内存中。

如果你正在努力找出一个对象作用域或用户管理,遵循这些指导方针:

  • 假设您正在使用的对象是一个作用域的对象,并将整理后本身。
  • 如果一个对象的文档提到删除函数,它可能是一个用户管理的对象。
  • 如果一个对象的文档有一个xxxfind方法(timerfind,daqfind等),它是最有可能的一个用户管理的对象。

不管上面的指导方针,这是好只是知道在MATLAB和作用域的对象和用户管理的对象存在
有不同的行为。

这曾经发生在你身上吗?

你有没有遇到问题与用户管理的对象?一个对象在MATLAB曾经被清理的时候你不期待吗
它吗?分享你的经验在这里

使用MATLAB®7.6发表

|

评论

留下你的评论,请点击在这里MathWorks账户登录或创建一个新的。