1

我在iOS上将C++ vars与obj-c异步代码粘合在一起时出现问题。Objective-C块,C++变量和异步代码

真正的问题是位于异步代码,我使用的是内置的C++意想不到对象所引用的第三方库,例如:

 

- (void) processFrame:(cv::Mat &)mat; 
 

我的问题真正的问题是如何调用呢?我需要在不同的线程创建C++对象,并把它传递给异步代码,有点像这样:


__block cv::Mat mat(videoRect.size.height, videoRect.size.width, CV_8UC4, baseaddress, 0); 
dispatch_async(dispatch_get_main_queue(), ^{ 
      [self processFrame:mat]; 
     }); 
 

这给一个错误(坏接入),问题是(我猜)的对象是该方法运行之前销毁,所以我试图创建在堆中的对象:


__block cv::Mat *mat= new cv::Mat(videoRect.size.height, videoRect.size.width, CV_8UC4, baseaddress, 0); 
dispatch_async(dispatch_get_main_queue(), ^{ 
      [self processFrame:(*mat)]; 
     }); 
 

而且还是:

 

__block cv::Mat *mat= new cv::Mat(videoRect.size.height, videoRect.size.width, CV_8UC4, baseaddress, 0); 
dispatch_async(dispatch_get_main_queue(), ^{ 
      [self processFrame:mat]; 
     }); 
 

我得到保持“坏访问”错误所有的时间

任何想法?

回答

2

__block限定符告诉编译器不要复制块的对象,这就是为什么它失败。如果您没有重新指定mat或者未尝试阻止不必要的保留/复制操作,则应该删除__block

cv::Mat mat(videoRect.size.height, videoRect.size.width, CV_8UC4, baseaddress, 0); 
dispatch_async(dispatch_get_main_queue(), ^{ 
      [self processFrame:mat]; 
     }); 

,你创建一个new cv::Mat可能会失败,因为你可能会过早地删除mat的例子。

__block cv::Mat *mat= new cv::Mat(videoRect.size.height, videoRect.size.width, CV_8UC4, baseaddress, 0); 
dispatch_async(dispatch_get_main_queue(), ^{ 
      [self processFrame:mat]; 
      //mat would need to be deleted here 
     }); 
delete mat; //If you are doing this, you will likely get an EXC_BAD_ACCESS 
+0

谢谢您的anwser,我仍然有同样的问题,甚至当我在堆中创建对象...我应该如何通过一个“堆对象”到期望对象引用的方法(如cv :: Mat&mat)? – user361526

+0

对于一个堆对象像这样''self processFrame:* mat];'传递它,那么你可以在调用之后立即删除mat;如果你不再使用它。 – Joe

+0

试过之前,仍然有同样的错误:(我只是试图使用另一个库,可以让我避免混合使用C++和Obj-C :)感谢您的帮助 – user361526