Ios 为什么当我没有';不使用局部变量吗?

Ios 为什么当我没有';不使用局部变量吗?,ios,objective-c,exc-bad-access,Ios,Objective C,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

我有一段代码,它将音频文件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错误访问线程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];
}
for(int i=0;i<16;i++){
AudioQueueAllocateBuffer(self.mQueue、file.bufferByteSize和_mbuffer[i]);
handleOutputBuffer((u桥空*)self,self.mQueue,_mBuffers[i]);
}
...
静态void handleOutputBuffer(void*aqData、AudioQueueRef audioQueue、AudioQueueBufferRef缓冲区)
{
TestViewController*vc=(u桥TestViewController*)aqData;
[vc句柄:aqData音频队列:音频队列缓冲区:缓冲区];
}
当i=1且对于i=0时,它会崩溃。OSStatus报告错误代码:2003334207

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

正如我在第一段代码中所说,一切都很好,我可以在iPhone和iPad上播放音乐

我很感激能得到的每一个帮助

哦,这是我的堆栈跟踪:

这背后的原因是我遵循了苹果指南
为了播放音频,现在我想创建一个包含所有必要信息的类,使其更加面向对象,因为苹果使用了一个结构。我刚刚通过更改这一行来修复它

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

你的应用程序是多线程的吗?是的,但是此代码的执行应该只在主线程上执行。当我的音频开始播放时,在后台线程上执行回调。此回调将填充缓冲区,但我的代码在任何播放之前已经崩溃。请尝试使用guard malloc