EXC_BAD_ACCESS在启动任务后的随机时间内

时间:2012-04-02 17:25:39

标签: objective-c ios

我有一段我的应用程序的代码,我得到了错误,我不知道是什么问题,当我打开设备相机并开始获取捕获帧时会发生此错误。这里奇怪的是,这有效,但在捕获开始的短时间或长时间内得到以下错误。

  

错误:“线程1:EXC_BAD_ACCESS(代码= 1,地址= 0xN)”,其中“N”是假设的十六进制存储器地址。

代码:

- (void)imageToBuffer:(CMSampleBufferRef)source
{ 
  NSData *data;

  CVImageBufferRef buffer = CMSampleBufferGetImageBuffer(source);
  CVPixelBufferLockBaseAddress(buffer, 0);

  size_t bytesPerRow = CVPixelBufferGetBytesPerRow(buffer);
  size_t height = CVPixelBufferGetHeight(buffer);
  void *bufferSrc = CVPixelBufferGetBaseAddress(buffer);

  data = [NSData dataWithBytes:bufferSrc length:bytesPerRow * height];
  CVPixelBufferUnlockBaseAddress(buffer, 0);

  [self.delegate didReceivedFrame:data];
}

@end


#pragma mark - AVCaptureVideoDataOutputSampleBufferDelegate implementation
@implementation AVCaptureManager (AVCaptureVideoDataOutputSampleBufferDelegate)

- (void)captureOutput:(AVCaptureOutput *)captureOutput didOutputSampleBuffer:(CMSampleBufferRef)sampleBuffer fromConnection:(AVCaptureConnection *)connection
{
  dispatch_async(dispatch_get_main_queue(), ^{
    [self imageToBuffer:sampleBuffer];
  });
}

此错误通常发生在以下行中:

CVPixelBufferLockBaseAddress(buffer, 0);

有什么想法吗?谢谢!

1 个答案:

答案 0 :(得分:2)

我会说错误在这里:

dispatch_async(dispatch_get_main_queue(), ^{
  [self imageToBuffer:sampleBuffer];
});

这个调用是异步调度的,据我所知,CMSampleBuffer不一定要保留它们的内容(数据可能在样本缓冲区对象之前发布)。

确保在主队列上发送同步

BTW:你为什么要首先在主线上发送?