Ios 在objective-C中的dispatch\u async中传递参数时,EXC\u访问错误

Ios 在objective-C中的dispatch\u async中传递参数时,EXC\u访问错误,ios,objective-c,exc-bad-access,Ios,Objective C,Exc Bad Access,我将一个变量传递给另一个方法。访问此属性时,应用程序因EXC_BAD_访问错误而崩溃 in class1: CVPixelBufferRef pixelBuffer; @implementation class1 - (void)captureOutput:(AVCaptureOutput *)output didOutputSampleBuffer:(CMSampleBufferRef)sampleBuffer fromConnection:(AVCaptureCon

我将一个变量传递给另一个方法。访问此属性时,应用程序因EXC_BAD_访问错误而崩溃

   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\U错误访问(代码=1,地址=0x800000600)

当我评论dispatch_async时,没有发生崩溃


根据另一个答案,这个错误(可能)是因为释放了对象。但是为什么在这种情况下它会被释放,但是没有dispatch_async,它不会被释放。

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

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


我还没有深入研究它,但考虑到数据类型,这可能意味着您需要调用
pixelBuffer
(然后在完成后调用
CVBufferRelease()

嗨,您在将pixelBuffer传递给CFRetain(pixelBuffer)时是否检查了pixelBuffer的值。@Muhammadzohaibehasan谢谢。在这种情况下,我看不到它的预览。文档中说CFRetain需要一个非空值。您正在传递导致运行时错误的空值。显示的代码不会在任何位置更新pixelBuffer的值。所以它很可能是空的,导致了崩溃。@Muhammadzohaibehansan我不知道为什么它是空的,我想对象被释放了。但是为什么它是以分派的方式发布的,而不是没有它。你能告诉代码你在哪里设置像素缓冲区吗?