0

我在我的 mac 应用程序中使用 AVAudioRecorder。在我的 .m 文件中,我声明

@interface RecordViewController ()
{
    AVAudioRecorder *audioRecorder;
...
}
@end

再往下,我然后像这样分配初始化对象:

audioRecorder = [[[AVAudioRecorder alloc] initWithURL:soundFileURL settings:recorderSettings error:&error] retain];
...
[audioRecorder prepareToRecord];
...
[audioRecorder record];

我可以看到文件已创建,但它只有 4KB。我没有收到错误消息,但是当我测试是否[audioRecorder isRecording]可以看到 [audioRecorder 不再录制。我假设该对象已被释放,即使我没有使用 ARC 并且没有调用 dealloc 方法。

我对 AVAudioPlayer 也有类似的问题,但retain]附加到 alloc init 的附加功能解决了这个问题。

我究竟做错了什么?

谢谢

更新 1:

我什至尝试过执行以下操作(均采用相同的方法):

[audioRecorder record];
NSLog(@"recording is ... %d", [audioRecorder isRecording]);

结果是0。???

我必须使用self吗?还是懒惰地实例化audioRecorder

更新 2: 我重新创建了项目 - 将其命名为 TEST 并从我的旧项目中复制了源代码。现在它起作用了?!?!去搞清楚。源代码是逐行相同的。这是 XCode 的一个已知问题吗?

4

2 回答 2

1

首先,根据您的评论,如果您仍然可以访问该实例,则意味着您的对象不是 dealloc。

AVAudioRecorder 提供一个委托(AVAudioRecorderDelegate)如果录制成功或出现错误,您是否尝试过使用委托记录日志?

特别是如果在录制时发生该方法 audioRecorderEncodeErrorDidOccur:error:应该会给您一些错误。

顺便说一句,retain]不需要添加,因为alloc init您拥有该对象的所有权,您应该释放。

于 2012-07-24T13:57:37.013 回答
0

除非你释放它,否则它不能被释放,因为你分配和初始化并且你不释放。(它也不是自动释放的。)

如果启用了 ARC,它必须是强的。

请看http://chinki-singh.blogspot.com/2011/07/how-to-record-audio-using.html

于 2012-07-24T13:44:37.920 回答