我创建了一个称为ARecorder的对象类。 (ARecorder.h / ARecorder.m)实现有几种方法:
-void(setupAndRecord)
-(void)stop
等等
我设置了一个
AVAudioSession
共享实例,使用NSURL
,alloc
和init
* 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,而不是直接访问实例变量,您应该习惯这样做。