【问题标题】:Objective-C Blocks, C++ Variables and async codeObjective-C 块、C++ 变量和异步代码
【发布时间】:2011-12-07 18:26:05
【问题描述】:

我在 iOS 上将 c++ vars 与 obj-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]; });

这给出了一个错误(Bad access),问题是(我猜)对象在方法运行之前就被销毁了,所以我尝试在堆中创建对象:

__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]; });

我总是遇到“Bad access”错误

有什么想法吗?

【问题讨论】:

    标签: c++ objective-c asynchronous pass-by-reference objective-c-blocks


    【解决方案1】:

    __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
    

    【讨论】:

    • 谢谢你的回答,我仍然有同样的问题,即使我在堆中创建对象......我应该如何将“堆对象”传递给期望对象引用的方法(如 cv::Mat & mat)?
    • 对于堆对象,像 [self processFrame:*mat]; 这样传递它,如果你不再使用它,你可以在调用之后立即 delete mat;
    • 之前试过了,还是一样的错误:(我只是尝试使用另一个库,让我避免混合 C++ 和 Obj-C :) 感谢您的帮助
    • 这应该可以尝试发布更多相关代码。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多