2017-09-25 416 views
0

我正在嘗試創建一個使用來自統一的音頻流的項目。爲此,我正在開發一個插件。Objective-C - BAD ACCESS EXC

在錄製音頻時沒有問題,我通過websocket以base64字符串發送數據。 然後從xcode中捕獲它並將其轉換爲NSDATA,這就是問題所在。起初沒有問題,但過了一會兒,Xcode顯示錯誤EXC_BAD_ACCESS,我無法繼續將NSDATA複製到緩衝區中。

這是代碼。

#import "AudioProcessor.h" 

#pragma mark Playback callback 

static OSStatus playbackCallback(void *inRefCon, 
          AudioUnitRenderActionFlags *ioActionFlags, 
          const AudioTimeStamp *inTimeStamp, 
          UInt32 inBusNumber, 
          UInt32 inNumberFrames, 
          AudioBufferList *ioData) { 


AudioProcessor audioProcessor = (AudioProcessor) inRefCon; 

// copy buffer to audio buffer which gets played after function return 
if(ioData->mNumberBuffers > 0) { 

    AudioBuffer buffer = ioData->mBuffers[0]; 

    // get the data from Unity 
    NSString *inputData = audioProcessor.getInputData; 

    if(inputData && ![inputData isKindOfClass:[NSNull class]]) 
    { 

     //here it's the problem. 
     NSData *data = [[NSData alloc] initWithBase64EncodedString:inputData options:0]; 

     memcpy(buffer.mData, data.bytes, data.length); 
     buffer.mDataByteSize = (int) data.length; 
     free(data); 
    } 

return noErr; 
} 

#pragma mark controll stream 

-(void)setInputData:(NSString *)datosValue 
{ 
    inputData = datosValue; 
} 

-(NSString*)getInputData 
{ 
    return inputData; 
} 

如果有人知道如何可以做到,這樣應用程序沒有關閉,我將不勝感激。

+0

最簡單的方法來檢測你錯在哪裏,從xcode啓用殭屍對象。通常是因爲嘗試訪問已經發布的對象而發生的。 – Govaadiyo

回答

1

首先請遵守變量名以小寫字母開頭的命名約定。

出現此錯誤的原因的NSData一個實例是一個對象/指針,你必須添加一個*

NSData *data = [[NSData alloc] init.... 

而且它強烈建議訪問屬性與點符號例如

data.bytes 
data.length 
+0

如果我們正在解決樣式錯誤,請注意'audioProcessor.getInputData' - 真正的Objective-C getter是名詞。沒有涉及動詞。你在問什麼,而不是告訴班級該做什麼;它可以實現,但是它想要的。 – Tommy

+0

我確實說過,但問題仍在繼續。 'NSData * data = [[NSData alloc] initWithBase64EncodedString:InputData options:0]; memcpy(buffer.mData,data.bytes,data.length); buffer.mDataByteSize =(int)data.length; 免費(數據);' –