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 和 AVAudioPlayer 并不总是播放声音
AVAssetWriter 记录设置不像 AVAudioRecorder 那样工作