【问题标题】:How do I set an AVAudioRecorder local instance as Property so it stays retained?如何将 AVAudioRecorder 本地实例设置为属性以使其保持保留?
【发布时间】:2014-03-01 13:40:28
【问题描述】:

我创建了一个名为 ARecorder 的对象类。 (ARecorder.h / ARecorder.m) 实现有几个方法:

-void(setupAndRecord) 
-(void)stop 

等等。

我设置了一个AVAudioSession共享实例,我用NSURLallocinit *记录器对象AVAudioRecorder设置了文件,准备记录。然后[recorder record][recorder recordforduration(NSTimer] - 我都试过了。

当我将 *MyRecorder 实例化为 ARecorder 类的对象时,说... viewcontroller 并调用 [... setupAndRecord] 方法 - 该对象显然是在 @987654334 内的 AVAudioRecorder 对象之前创建和释放的@ 实例化有机会做任何事情......它创建文件,开始记录,然后对象MYRecorder 显然立即被释放。

如果我设置一个循环,或者在*MYRecorder 中使用@selector afterdelay,它会记录...这是一个hack,而不是正确的方法。

我已将*recorder 设置为属性:

@property (strong, nonatomic) AVAudioRecorder *recorder 

我也将它声明为实例变量。没有什么可以让它保持分配状态。我知道我需要使用属性而不是在方法中分配和初始化 AVAudioRecorder *recorder 对象?那我怎么转这个

"recorder = [[AVAudioRecorder alloc] initWithContentsOfURL:myURL error:&err];" 

放入属性而不是本地实例?

如果我将所有这些代码移至视图控制器 - 显然视图控制器保留在内存中,因此实例化 AVAudioRecorder 对象的 -void(setupAndRecord) 方法将保持保留直到完成 - 但不是 MVC 模式的重点将模型与视图分离?

我还想在视图控制器中使用audioRecorderdidfinishrecording delegate - 但我不知道如何在MYRecorder 对象中获取AVAudioRecorder *recorder 的实例以在视图控制器中使用delegate

我希望视图控制器成为*recorderdelegate,并在audioRecorderDidFinishRecording[recorder recordforduration...] 的末尾调用时执行某些操作

如果对象没有在内存中停留足够长的时间甚至无法记录,则显然不会调用委托方法。但是假设MYRecorder 对象由于某种疯狂的原因被保留,在[... recordforduration] 的末尾,它如何使用视图控制器中而不是MYRecorder 中的委托方法?我想要MYRecorder 对象做的只是记录并在完成后告诉视图控制器中的didfinishrecording 委托。看起来应该没那么难。

【问题讨论】:

  • 天哪。请花一些时间格式化您的问题。
  • 谢谢...新来的 SO - 这真的归结为:recorder = [[AVAudioRecorder alloc] initWithContentsOfURL:myURL error:&err]; 正在立即创建和释放实例。如何将该实例存储在属性中而不是本地实例中?

标签: ios objective-c cocoa-touch delegates avaudioplayer


【解决方案1】:

听起来问题在于您的 MyRecorder 对象的所有权。

我建议您将 MyRecorder 设为单例。在 SO 上搜索 Objective-C 中的单例设计模式。你应该找到很多例子。

您的强属性语法是正确的。如果您的 MyRecorder 有一个属性:

@property (strong, nonatomic) AVAudioRecorder *recorder 

然后在 MyRecorder 的设置代码中,您将使用如下代码:

self.recorder = [[AVAudioRecorder alloc] initWithContentsOfURL:myURL error:&err];

请注意,它读取的是 self.recorder,而不是 recorder。这使用属性的设置器,而不是直接访问实例变量,您应该养成这样做的习惯。

【讨论】:

  • 这个问题的答案是否足够:stackoverflow.com/questions/20164873?看来他创建了一个单例,然后将其用于: [[NIKPlayer sharedPlayer] playURL:audioURL]; [[NIKPlayer sharedPlayer].currentPlayer prepareToPlay];
  • 谢谢...我创建了单例,它工作正常 - 现在进入委托部分。我希望我的viewcontroller 成为代表。我在我的 VC 中实现了委托协议的-(void)audioRecorderDidFinishRecording:(AVAudioRecorder *)sharedRecorder successfully:(BOOL)flag 方法,但是“录制”功能都发生在“录制器”中。我如何在 VC 中使用委托来找出“记录器”didfinishrecording 的时间?
  • 如果此解决方案有效,请将其标记为已接受。您可能应该为委派问题创建一个新问题,以便其他 SO 用户更容易找到。
猜你喜欢
  • 1970-01-01
  • 2020-06-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-02-12
相关资源
最近更新 更多