【发布时间】:2014-03-01 13:40:28
【问题描述】:
我创建了一个名为 ARecorder 的对象类。 (ARecorder.h / ARecorder.m) 实现有几个方法:
-void(setupAndRecord)
-(void)stop
等等。
我设置了一个AVAudioSession共享实例,我用NSURL、alloc和init *记录器对象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。
我希望视图控制器成为*recorder 的delegate,并在audioRecorderDidFinishRecording 在[recorder recordforduration...] 的末尾调用时执行某些操作
如果对象没有在内存中停留足够长的时间甚至无法记录,则显然不会调用委托方法。但是假设MYRecorder 对象由于某种疯狂的原因被保留,在[... recordforduration] 的末尾,它如何使用视图控制器中而不是MYRecorder 中的委托方法?我想要MYRecorder 对象做的只是记录并在完成后告诉视图控制器中的didfinishrecording 委托。看起来应该没那么难。
【问题讨论】:
-
天哪。请花一些时间格式化您的问题。
-
谢谢...新来的 SO - 这真的归结为:
recorder = [[AVAudioRecorder alloc] initWithContentsOfURL:myURL error:&err];正在立即创建和释放实例。如何将该实例存储在属性中而不是本地实例中?
标签: ios objective-c cocoa-touch delegates avaudioplayer