当我不使用局部变量时,为什么会出现EXC BAD ACCESS?
问题描述:
我有这段代码从AudioFileID读取数据到缓冲区。当我在我的方法是这样当我不使用局部变量时,为什么会出现EXC BAD ACCESS?
EDCAudioFile *file = vc.file;
OSStatus err = AudioFileReadPacketData(file.audioFile, NO, &numBytesReadFromFile, vc.mPacketDescs, file.currentPacket, &numPackets, buffer->mAudioData);
EDCAudioFile声明一个局部变量
- (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);
一切正常,是包含这样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错误访问线程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];
}
它确实崩溃时,我= 1,对于I = 0 OSStatus报告错误与此代码:2003334207
NSZombie告诉任何操作,该代码甚至不上我的IPhone 5,但是,我崩溃小型平板电脑。方法在主线程上调用。
正如我所说的第一块代码一切都很好,我可以在我的iPhone和iPad上播放音乐。
我很感激我能得到的每一个帮助。
哦,这里是我的堆栈跟踪: stack trace
这背后的原因是,我跟着这个苹果直营店Audio Queue 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);
是你的应用程序的多线程? – nielsbot 2015-02-06 17:52:18
是的,但是这个代码的执行应该只在主线程上执行。当我的音频开始播放时,会调用一个在后台线程上执行的回调。此回调填充缓冲区,但在播放任何游戏之前,我的代码已经崩溃。 – Duc 2015-02-06 18:55:57
尝试使用警卫malloc – nielsbot 2015-02-07 19:55:15