当我不使用局部变量时,为什么我得到EXC BAD ACCESS?

时间:2015-02-06 17:21:58

标签: ios objective-c exc-bad-access

我有这个代码块,它将AudioFileID中的数据读入缓冲区。

- (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上播放音乐。

我感谢我能得到的每一个帮助。

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

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

1 个答案:

答案 0 :(得分:0)

我刚刚通过更改此行来解决此问题

- (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);