アプリをロードするたびに、この行にブレークポイントを設定したかのように停止します。
self.audioPlayer =
[[[AVAudioPlayer alloc] initWithData:[dataPersister loadData:self.fileName]
error:&outError] autorelease];
上またはこの行の近くにブレークポイントはありません。デバッグモードでアプリを実行したときにのみ発生し、ブレークポイント後に何もクラッシュしません。 [プログラムの実行を続行]をクリックしても何も起こらないため、アプリは機能します。
これは、initWithData
で呼び出されるloadDataメソッドです。
-(NSData*)loadData:(NSString*)fileName
{
NSString *dataPath = [self.path stringByAppendingPathComponent:fileName];
dataPath = [dataPath stringByStandardizingPath];
NSData *data = [[[NSData alloc] initWithContentsOfFile:dataPath]autorelease ];
return data;
}
LoadData関数は正常に機能しているようです。要求されたmp3ファイルは、ブレークポイント後に問題なくロードおよび再生されます。
私が間違っていることを知っていますか?
編集:ブレークポイントで停止したときにバックトレースを実行しました。これは出力でした:
(lldb)bt *スレッド#1:tid = 0x1c03、0x30df1724 libc ++ abi.dylib`__cxa_throw、停止理由=ブレークポイント1.2 フレーム#0:0x30df1724 libc + + abi.dylib`__cxa_throw frame#1:0x36403a24 AudioToolbox`ID3ParserHandle :: ID3ParserHandle(void *、long(*)(void *、unsigned long、unsigned long、unsigned long、void **、unsigned long * ))+ 452 frame#2:0x36403b0e AudioToolbox`ID3ParserOpen + 142 frame#3:0x3635bd16 AudioToolbox`MPEGAudioFile :: ParseID3Tags()+ 58 frame#4:0x3635b9aa AudioToolbox `MPEGAudioFile :: ParseAudioFile()+ 26 frame#5:0x3631723e AudioToolbox`AudioFileObject :: DoOpenWithCallbacks(void *、long(*)(void *、long long、unsigned long、void *、unsigned long *) 、long(*)(void *、long long、unsigned long、void const *、unsigned long *)、long long(*)(void *)、long(*)(void *、long long))+ 166 フレーム#6:0x36316480 AudioToolbox`AudioFileOpenWithCallbacks + 612 フレーム#7:0x31f4c1ec AVFoundation`- [AVAudioプレーヤーinitWithData:error:] + 120
"SOLUTION":すべての例外に対して例外ブレークポイントを無効にし、Objective-C例外に対してのみブレークポイントを使用すると、問題はなくなります。しかし、AVAudioPlayerの割り当てがC++例外をスローするという問題は解決しません。
例外ブレークポイントを追加し、例外タイプを「すべて」から「Objective-C例外」に編集します
AudioToolboxの一部のクラスは、通常のC++例外をスローします。この方法でフィルタリングできます。
AVAudioPlayerとAVAudioRecorderは両方とも例外をスローしますが、そのうちのいくつかは例外です。これらはプレーヤーによって内部的に処理されますが、「すべてのブレークポイント」のブレークポイント(例外:すべて、ブレーク:スロー時)がある場合、これらの例外をキャッチします。これらの実行を継続すると、アプリは正常に実行され続け、まったくクラッシュしません。
これまでに思いついた唯一の解決策は、ブレークポイントナビゲータのブレークポイントバーをクリックし、この特定のブレークポイントを無効にして、無効にして実行することです。
スローされた例外でアプリがクラッシュする場合/発生した場合、cmd-6を押し、そのブレークポイントを有効にして、クラッシュしたときに実行したことを再実行します。
編集:「Objective-C例外」への設定は、明らかにそれを行う方法です。上記の回答をご覧ください!
バックトレースは大いに役立ちました、ありがとう!最近、同じ問題に遭遇し始めました。スローされたmp3ファイルには有効なID3タグがなく、 Tagr などのアプリを介して実行されていたことが判明しました!