不使用局部变量时为什么会获得EXC BAD ACCESS?

杜克

我有这段代码,它将音频文件ID中的数据读取到缓冲区中。

- (void)handle:(void *)aqData audioQueue:(AudioQueueRef) audioQueue buffer:(AudioQueueBufferRef) buffer
{
TestViewController *vc = (__bridge TestViewController *)aqData;

EDCAudioFile *file = vc.file;
UInt32 numPackets = file.numberOfPacketsToRead;
UInt32 numBytesReadFromFile;

OSStatus err = AudioFileReadPacketData(file.audioFile, NO, &numBytesReadFromFile, vc.mPacketDescs, file.currentPacket, &numPackets, buffer->mAudioData);

当我在这样的方法中声明局部变量时,一切工作正常

EDCAudioFile *file = vc.file;
OSStatus err = AudioFileReadPacketData(file.audioFile, NO, &numBytesReadFromFile, vc.mPacketDescs, file.currentPacket, &numPackets, buffer->mAudioData);

EDCAudioFile是一个类,其中包含AudioFileID的属性,如下所示:

@property (nonatomic, assign) AudioFileID audioFile;

但是当我将其更改为

OSStatus err = AudioFileReadPacketData(vc.file.audioFile, NO, &numBytesReadFromFile, vc.mPacketDescs, file.currentPacket, &numPackets, buffer->mAudioData);

而vc包含此属性

@property (nonatomic, strong) EDCAudioFile *file;

它使用EXC BAD ACCESS线程1地址0x4崩溃。当我从模态视图控制器中选取一首歌曲,并且该方法创建具有16个缓冲区的音频队列并将其填充音频数据时,该方法将像这样被调用。

for (int i=0; i < 16; i++) {
    AudioQueueAllocateBuffer(self.mQueue, file.bufferByteSize, &_mBuffers[i]);
    handleOutputBuffer((__bridge void*) self, self.mQueue, _mBuffers[i]);
}

...

static void handleOutputBuffer (void *aqData, AudioQueueRef audioQueue, AudioQueueBufferRef buffer)
{
     TestViewController *vc = (__bridge TestViewController *)aqData;
     [vc handle:aqData audioQueue:audioQueue buffer:buffer];
}

当i = 1且对于i = 0时,它确实崩溃OSStatus报告错误,其代码为:2003334207

NSZombie什么也没说,该代码甚至不会在我的iPhone 5上崩溃,而是在我的iPad Mini上崩溃。在主线程上调用方法。

就像我说的第一段代码一样,一切都很好,我能够在iPhone和iPad上播放音乐。

感谢您能获得的所有帮助。

哦,这是我的堆栈跟踪:堆栈跟踪

这背后的原因是,我遵循了《 Apple Guide音频队列指南》来播放音频,现在我想通过创建一个包含所有必需信息的类来使其更面向对象,因为Apple为此使用了结构。

杜克

我已经通过更改此行解决了

- (void)handle:(void *)aqData audioQueue:(AudioQueueRef) audioQueue buffer:(AudioQueueBufferRef) buffer

对此

- (void)handle:(TestViewController *)aqData audioQueue:(AudioQueueRef) audioQueue buffer:(AudioQueueBufferRef) buffer
{
    UInt32 numBytesReadFromFile;
    UInt32 numPackets = vc.file.numberOfPacketsToRead;

    AudioFileReadPacketData(vc.file.audioFile, NO, &numBytesReadFromFile, vc.packetDescs, vc.file.currentPacket, &numPackets, buffer->mAudioData);

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

为什么使用std :: transform会导致exc_bad_access

来自分类Dev

为什么对字符串使用%1 $ s时得到EXC_BAD_ACCESS(格式:)

来自分类Dev

EXC_BAD_ACCESS在mergeChangesFromContextDidSaveNotification

来自分类Dev

EXC_BAD_ACCESS-NSURLConnection

来自分类Dev

斯威夫特:EXC_BAD_ACCESS

来自分类Dev

SKTexture EXC_BAD_ACCESS

来自分类Dev

EXC_BAD_ACCESS StringWithFormat

来自分类Dev

为什么在回调指针指向函数时使用EXC_BAD_ACCESS(code = EXC_I386_GPFLT)?

来自分类Dev

EXC_BAD_ACCESS 执行关闭时

来自分类Dev

执行块时EXC_BAD_ACCESS

来自分类Dev

EXC_BAD_ACCESS为什么我的对象被释放?

来自分类Dev

为什么会出现EXC_BAD_ACCESS错误

来自分类Dev

EXC_BAD_ACCESS 使用instantiateViewController 時

来自分类Dev

为什么在构造函数中释放会导致EXC_BAD_ACCESS?

来自分类Dev

为什么glDrawArrays会导致EXC_BAD_ACCESS(代码= 2,地址= 0x0)?

来自分类Dev

在代码中添加UINavigationController时使用EXC_BAD_ACCESS

来自分类Dev

使用数组C ++时的“ EXC_BAD_ACCESS”

来自分类Dev

为什么有时从 DISpatchQueue 调用时会出现 EXC_BAD_ACCESS?

来自分类Dev

在performSelectorInBackground上为EXC_BAD_ACCESS

来自分类Dev

EXC_BAD_ACCESS错误OpenCV?

来自分类Dev

didSet导致EXC_BAD_ACCESS

来自分类Dev

EXC_BAD_ACCESS而[WKInterfaceTable setNumberOfRows:withRowType]

来自分类Dev

setMask上的EXC_BAD_ACCESS

来自分类Dev

heightForRowAtIndexPath iOS中的EXC_BAD_ACCESS

来自分类Dev

fscanf中的Exc_bad_access错误

来自分类Dev

指向函数头的EXC_BAD_ACCESS

来自分类Dev

EXC_BAD_ACCESS-如何避免呢?

来自分类Dev

NSNumber objCType EXC_BAD_ACCESS

来自分类Dev

委托分配导致EXC_BAD_ACCESS

Related 相关文章

热门标签

归档