簡體   English   中英

當我不使用局部變量時為什么會得到EXC BAD ACCESS?

[英]Why am I getting EXC BAD ACCESS when I don't use a local variable?

我有這段代碼,它將音頻文件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);

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM