防止从C++代码中调用ObjtoEc对象
以下是我的情况: 我正在使用音频队列服务来录制声音。当在缓冲区已满时调用回调函数时,我会将缓冲区内容发送到objective-C对象以对其进行处理防止从C++代码中调用ObjtoEc对象,c++,ios,exc-bad-access,audioqueueservices,C++,Ios,Exc Bad Access,Audioqueueservices,以下是我的情况: 我正在使用音频队列服务来录制声音。当在缓冲区已满时调用回调函数时,我会将缓冲区内容发送到objective-C对象以对其进行处理 void AQRecorder::MyInputBufferHandler(void * inUserData, AudioQueueRef inAQ,
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_访问,经过一些研究,我猜这与myObj被释放有关
进程从缓冲区内容执行for循环,即使我只对缓冲区值执行NSLog,也会得到EXC_BAD_访问错误
-(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,我的代码的其余部分似乎可以正常工作
谢谢 将缓冲区malloc并强制转换为“short*”,然后使用“bufferSize”字节数枚举缓冲区。这意味着“for”循环最终将尝试读取超过缓冲区的末尾,这可能导致“EXE\u BAD\u ACCESS”。这是因为每次迭代都是以一个“短”而不是一个“字节”前进的。您应该将循环更改为以下内容:
for(int i= 0; i < bufferSize / sizeof(short); i++) {
NSLog("value: %i", buffer[i]);
}
要么这样做,要么更改“buffer”成员变量的类型。我不确定您为什么认为“myObj”会被释放,因为您没有调用“autorelease”。我的“objective c”有点生疏,但您显示的代码更像是内存泄漏。也许你可以展示“MyObjCObject.process”的内部结构。@Karmasbone刚刚添加了一些细节。如果你不正确使用NSLog,你将获得EXC\u BAD\u访问权限。我们需要了解MyObjCObject进程的内部结构:现在,据我所知,这行qr->Objective\u调用[NSData dataWithBytes:inBuffer->mAudioData length:inBuffer->mAudioDataBytesCapacity];正在创建一个自动删除的NSData对象,该对象将在当前运行循环后解除锁定,除非您专门将其保留在某个位置。谢谢@Karmasbone!EXC\u坏访问问题已修复。