2017-09-25 195 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; 免费(数据);' –