我将一个变量传递给另一个方法。访问此属性时,应用程序因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,它没有被释放。
CVImageBufferRef
返回的CMSampleBufferGetImageBuffer()
不是一个对象,它只是一个C结构,所以它不会参与引用计数。如果您要将其传递到异步运行的块中,则需要确保该数据保持有效。请注意,文档特别告诉您:
调用者不拥有返回的缓冲区,如果调用者需要维护对它的引用,则必须显式保留它。
我没有挖得太远,但考虑到数据类型可能意味着你需要在CVBufferRetain()
上调用pixelBuffer
(当你完成它时再调用CVBufferRelease()
)。