簡體   English   中英

防止釋放從C ++代碼調用的Objective-C對象

[英]Prevent Objective-C object called from C++ code being released

這是我的情況:

我正在使用音頻隊列服務來錄制聲音。 當回調函數被調用時(緩沖區已滿),我將緩沖區內容發送到Objective-C對象進行處理。

void AQRecorder::MyInputBufferHandler(void *                                inUserData,
                                      AudioQueueRef                         inAQ,
                                      AudioQueueBufferRef                   inBuffer,
                                      const AudioTimeStamp *                inStartTime,
                                      UInt32                                inNumPackets,
                                      const AudioStreamPacketDescription*   inPacketDesc)
{
    AQRecorder *aqr = (AQRecorder *)inUserData;
    try {
        if (inNumPackets > 0) {
            NSLog(@"Callback ! Sending buffer content ...");
            aqr->objectiveC_Call([NSData dataWithBytes:inBuffer->mAudioData length:inBuffer->mAudioDataBytesCapacity]);
            aqr->mRecordPacket += inNumPackets;
        }

        if (aqr->IsRunning())
            XThrowIfError(AudioQueueEnqueueBuffer(inAQ, inBuffer, 0, NULL), "AudioQueueEnqueueBuffer failed");
    } catch (CAXException e) {
        char buf[256];
        fprintf(stderr, "Error: %s (%s)\n", e.mOperation, e.FormatError(buf));
    }
}

void AQRecorder::objectiveC_Call(NSData *buffer) {
    MyObjCObject *myObj = [[MyObjCObject alloc] init];
    [myObj process:buffer];
}

這里的問題是我在處理過程中(通過myObj的處理方法)得到了EXC_BAD_ACCESS,經過一番研究后,我猜想它與myObj的發布有關。

MyObjCObject.process從緩沖區內容執行for循環,即使我僅對緩沖區值執行NSLog也會收到EXC_BAD_ACCESS錯誤。

-(void)run:(NSData *)bufferReceived {
   NSUInteger bufferSize = [bufferReceived length];
   self.buffer = (short *)malloc(bufferSize);
   memcpy(self.buffer, [bufferReceived bytes], bufferSize);

   for(int i= 0; i < bufferSize; i++) {
      NSLog("value: %i", buffer[i]);
   }

}  

你能告訴我這樣做的方法嗎?

ps:我的文件擴展名為.mm ,在整個項目中都啟用了ARC,我的其余代碼似乎按預期工作。

謝謝 !

您分配了緩沖區並強制轉換為'(short *)',但是隨后使用'bufferSize'(字節數)枚舉了緩沖區。 這意味着“ for”循環最終將嘗試讀取緩沖區的末尾,從而可能導致“ EXE_BAD_ACCESS”。 那是因為每次迭代都以“短”而不是“字節”前進。 您應該將循環更改為:

for(int i= 0; i < bufferSize / sizeof(short); i++) {
    NSLog("value: %i", buffer[i]);
}

要么更改“緩沖區”成員變量的類型。

暫無
暫無

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

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