Ios 在objective-C中的dispatch\u async中传递参数时,EXC\u访问错误
我将一个变量传递给另一个方法。访问此属性时,应用程序因EXC_BAD_访问错误而崩溃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
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我不知道为什么它是空的,我想对象被释放了。但是为什么它是以分派的方式发布的,而不是没有它。你能告诉代码你在哪里设置像素缓冲区吗?