ObjecTips

Swift & Objective-C で iOS とか macOS とか

AVAudioRecorder deleteRecording でクラッシュ

AVAudioRecorder を生成後、録音を開始しないまま deleteRecording メソッドを呼ぶとクラッシュしたりエラーが出たりする。
以下のコードで試せる。

iOS 8.2, iOS 8.3 ではクラッシュ
iOS 9.0 β ではコンソールに以下のエラーが出たがクラッシュはしなかった。

objc[1009]: NSError object 0x127d2c8c0 overreleased while already deallocating; break on objc_overrelease_during_dealloc_error to debug

という事で AVAudioRecorder 自体やこれを使ったクラスの後始末の処理の際には注意が必要。

例えば

  • recording プロパティが YES であれば deleteRecording を呼ぶようにする。
  • 録音開始時に AVAudioRecorder を生成するようにして、録音待機状態ではインスタンスを保持しないようにする。(結果、後処理時にインスタンスに対して deleteRecording を呼ばないようにする)
  • 後処理には stop メソッドのみを使用し deleteRecording メソッドは使用しない。
  • deleteRecording を用いて同一の AVAudioRecorderインスタンスで再録音を行わずに、録音時には常に新しい AVAudioRecorderインスタンスを使用するようにする。(deleteRecording メソッド自体を一切呼ばないようにする)

このように実装の仕方によって問題を回避できると思う。


追記
OS X 10.10 でも同じコードを試したところクラッシュした。