在objective-C中的dispatch_async中传递参数时的EXC_BAD_ACCESS

问题描述 投票:2回答:1

我将一个变量传递给另一个方法。访问此属性时,应用程序因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,它没有被释放。

ios objective-c exc-bad-access
1个回答
4
投票

CVImageBufferRef返回的CMSampleBufferGetImageBuffer()不是一个对象,它只是一个C结构,所以它不会参与引用计数。如果您要将其传递到异步运行的块中,则需要确保该数据保持有效。请注意,文档特别告诉您:

调用者不拥有返回的缓冲区,如果调用者需要维护对它的引用,则必须显式保留它。

我没有挖得太远,但考虑到数据类型可能意味着你需要在CVBufferRetain()上调用pixelBuffer(当你完成它时再调用CVBufferRelease())。

© www.soinside.com 2019 - 2024. All rights reserved.