EXC_BAD_ACCESS в произвольное время после запуска задачи - PullRequest
1 голос
/ 02 апреля 2012

У меня есть фрагмент кода моего приложения, в котором я получаю сообщение об ошибке, из-за которого я понятия не имею, в чем проблема, и эта ошибка возникает, когда я открываю камеру устройства и начинаю получать кадры захвата. Странная вещь здесь, это работает, но получает ошибку ниже в короткое или долгое время захвата началось.

Ошибка: «Поток 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 Ответ

2 голосов
/ 02 апреля 2012

Я бы сказал, что ошибка здесь:

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

Этот вызов отправляется асинхронно, и, насколько мне известно, CMSampleBuffer s не обязательно удерживают их содержимое (данные могут быть переданы раньшеобразец буферного объекта).

Убедитесь, что вы отправили его синхронно в основную очередь.

Кстати: почему вы отправляете в основной поток в первую очередь?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...