EXC_BAD_ACCESS при передаче параметра в dispatch_async в target-C - PullRequest
0 голосов
/ 04 марта 2019

Я передаю переменную другому методу.при доступе к этому свойству приложение вылетает с ошибкой EXC_BAD_ACCESS.

   in class1: 
  CVPixelBufferRef pixelBuffer;
  @implementation class1
     - (void)captureOutput:(AVCaptureOutput *)output didOutputSampleBuffer:(CMSampleBufferRef)sampleBuffer fromConnection:(AVCaptureConnection *)connection {
        pixelBuffer = CMSampleBufferGetImageBuffer(sampleBuffer);
        dispatch_async( dispatch_get_main_queue(), ^{
           predictions = [dTFG runX:pixelBuffer orientation: UIDeviceOrientationPortrait CardRect: _vwRect];

       }
     }
   } 

    in class2:
    - (NSArray*) runX:(CVPixelBufferRef) pixelBuffer orientation: (UIDeviceOrientation) orientation CardRect:(CGRect) CardRect {
       CFRetain(pixelBuffer);  // Error: Thread 1: EXC_BAD_ACCESS (code=1, address=0x800000060)
    }

Поток 1: EXC_BAD_ACCESS (код = 1, адрес = 0x800000060)

Когда я комментировал dispatch_async, сбойне произошло.

Согласно другому ответу, эта ошибка (вероятно) из-за освобожденного объекта.но почему он освобождается в этой ситуации, но без dispatch_async не освобождается.

1 Ответ

0 голосов
/ 04 марта 2019

CVImageBufferRef, возвращаемое CMSampleBufferGetImageBuffer(), не является объектом, это просто структура C, поэтому он не будет участвовать в подсчете ссылок.Если вы собираетесь передать его в блок, который работает асинхронно, вам необходимо убедиться, что эти данные остаются действительными.Обратите внимание, что документация конкретно говорит вам:

Вызывающая сторона не является владельцем возвращенного буфера и должна сохранять его явно, если вызывающая сторона должна поддерживать ссылку на него.

Я не слишком углубился в это, но учитывая тип данных, это, вероятно, означает, что вам нужно вызвать CVBufferRetain() на pixelBuffer (а затем CVBufferRelease(), когдавы сделали с этим).

...