AVAudioPlayer在调试模式下抛出断点

Tho*_*sen 105 iphone cocoa-touch objective-c avaudioplayer ios

每次加载应用程序时,它都会停止,就好像我在此行上设置了一个断点:

self.audioPlayer = 
 [[[AVAudioPlayer alloc] initWithData:[dataPersister loadData:self.fileName] 
                                error:&outError] autorelease];
Run Code Online (Sandbox Code Playgroud)

这条线上方或附近没有断点.它只在我在调试模式下运行应用程序时发生,并且在断点之后没有任何崩溃.当我点击"继续执行程序"时,该应用程序无效.

这是loadData方法,使用initWithData以下方法调用:

-(NSData*)loadData:(NSString*)fileName
{
    NSString *dataPath = [self.path stringByAppendingPathComponent:fileName];
    dataPath = [dataPath stringByStandardizingPath];
    NSData *data = [[[NSData alloc] initWithContentsOfFile:dataPath]autorelease ];
    return data;
}
Run Code Online (Sandbox Code Playgroud)

loadData函数似乎工作正常.在断点之后加载并播放请求的mp3文件没有任何问题.

你知道我做错了什么吗?

编辑: 当它在断点处停止时我跑了回溯.这是输出:

(lldb) bt
* thread #1: tid = 0x1c03, 0x30df1724 libc++abi.dylib`__cxa_throw, stop reason = breakpoint 1.2
    frame #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
    frame #6: 0x36316480 AudioToolbox`AudioFileOpenWithCallbacks + 612
    frame #7: 0x31f4c1ec AVFoundation`-[AVAudioPlayer initWithData:error:] + 120

"解决方案":事实证明,如果我为所有异常禁用异常断点并且仅对Objective-C异常使用断点,则问题将消失.但它并没有解决AVAudioPlayer的分配引发C++异常的问题.

Mug*_*nth 171

添加异常断点并将异常类型从"All"编辑为"Objective-C exceptions"

AudioToolbox中的某些类会抛出常规的C++异常.您可以通过这种方式过滤它们.

  • "AVAudioPlayer不应该抛出随机异常" - 这不在我们手中.这就是框架的编写方式,你必须忍受它.虽然,我同意这不是一个好主意 (10认同)
  • 正如我在我的问题中写过"解决方案"部分,我不认为这是一个解决方案.`AVAudioPlayer`不应该抛出随机异常. (6认同)

Kal*_*lle 21

AVAudioPlayer和AVAudioRecorder都会抛出异常,其中有几个异常.这些是由玩家在内部处理的,但如果你有一个"所有断点"的断点(即例外:全部,休息:投掷),你将捕获这些例外.如果继续执行这些操作,应用程序将继续正常运行而不会崩溃.

到目前为止,我提出的唯一解决方案是单击断点导航器中的断点栏,禁用此特定断点,并禁用它.

当/如果应用程序崩溃时抛出异常,我cmd-6,启用该断点,并重新运行并执行崩溃时所做的任何事情.

编辑:设置为"Objective-C例外"显然是如何做到的.见上面的答案!


Ste*_*ald 7

这是显示我如何修复此错误的屏幕截图。我不确定这是否与上面的答案所讨论的方式相同,但我认为它是相似的。

  1. 转到Xcode中的Breakpoint导航器。
  2. 按住Control键并单击“所有例外”行。
  3. 选择“编辑断点...”选项。
  4. Exception从更改AllObjective-C

在此处输入图片说明