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

-void(setupAndRecord)
-(void)stop

等等

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

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

如果我设置了循环,或在afterdelay中使用@selector *MYRecorder,它将记录...这是一种破解,而不是正确的方法。

我已经将*recorder设置为属性:
@property (strong, nonatomic) AVAudioRecorder *recorder

我也将其声明为实例var。没有什么让它保持分配状态。我知道我需要使用属性而不是在方法内部分配和初始化AVAudioRecorder * recorder对象?那我该怎么转
"recorder = [[AVAudioRecorder alloc] initWithContentsOfURL:myURL error:&err];"

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

如果我将所有这些代码移到viewcontroller上-显然viewcontroller保留在内存中,那么实例化-void(setupAndRecord)对象的AVAudioRecorder方法将保持不变,直到完成-但是MVC模式将模型从视图中分离出来的目的不是吗?

我也想在ViewController中使用audioRecorderdidfinishrecording delegate-但我不知道如何在AVAudioRecorder *recorder对象中获取MYRecorder实例以在ViewController中使用delegate

我希望viewcontroller是delegate*recorder并在audioRecorderDidFinishRecording的结尾处调用[recorder recordforduration...]时做一些事情

显然,如果对象在内存中停留的时间不足以甚至无法记录,则将不会调用委托方法。但是可以说MYRecorder对象由于某种疯狂的原因而被保留了,在[... recordforduration]的末尾,它如何使用视图控制器中而不是MYRecorder中的委托方法?我只希望MYRecorder对象要做的就是记录并在完成时告诉Viewcontroller中的didfinishrecording委托。似乎应该没有那么困难。

最佳答案

听起来问题出在MyRecorder对象的所有权上。

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

您的强属性语法正确。如果您的MyRecorder具有属性:

@property (strong, nonatomic) AVAudioRecorder *recorder

然后,在MyRecorder的设置代码中,您将使用如下代码:
self.recorder = [[AVAudioRecorder alloc] initWithContentsOfURL:myURL error:&err];

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

07-28 03:43