AVAudioRecorder 不保留

Posted

技术标签:

【中文标题】AVAudioRecorder 不保留【英文标题】:AVAudioRecorder does not stay retained 【发布时间】:2012-07-24 13:19:22 【问题描述】:

我在我的 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 时遇到了类似的问题,但附加到 alloc init 的附加 retain] 解决了这个问题。

我做错了什么?

谢谢

更新 1:

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

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

结果为0。 ???

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

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

【问题讨论】:

您是否在程序上运行了僵尸程序来检查保留计数?如果audioRecorder 被释放,如果你在上面调用isRecording,你似乎会遇到错误的访问错误。 如果我在仪器中运行它,则不会创建 NSZombie。当我调用 isRecording 时,我也没有收到错误或错误的访问调用。 【参考方案1】:

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

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

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

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

【讨论】:

已经/已经实现了委托方法,没有错误被记录。我只添加了保留,因为我注意到除非我这样做,否则 AVAudioPlayer 对象不会保留。它会开始播放一瞬间然后停止。一旦我添加了retain],它就可以正常播放了。我什至变得偏执并添加了编译器标志 -fno-objc-arc 只是为了确保 ARC 真的没有激活。 我也实现了-(void)audioRecorderDidFinishRecording:(AVAudioRecorder *)recorder successfully:(BOOL)flag,但它永远不会被调用。 还有一件事需要澄清。当我调用 [audioRecorder isRecording] 时,即在 NSLog 中,我得到 0 结果 - 但没有错误。【参考方案2】:

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

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

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

【讨论】:

我唯一一次调用[audioRecorder release] 是在dealloc 方法中,它不会被调用(我在方法中有一个NSLog 以确保)。如前所述,我创建了一个没有检查 ARC 的项目。 Ivar 默认为__strong

以上是关于AVAudioRecorder 不保留的主要内容,如果未能解决你的问题,请参考以下文章

AVAudioRecorder 不保存文件

AVAudiorecorder 和 AVAudioPlayer 并不总是播放声音

AVAssetWriter 记录设置不像 AVAudioRecorder 那样工作

AVAudioRecorder 不保存录音

iOS上的AVAudioRecorder错误“不支持播放数据格式”?

使用 AVAudioRecorder 录制后,AVAudioPlayer 不通过扬声器播放