1

iOSでobj-c非同期コードを使用してC++変数を結合する際に問題が発生しています。Objective-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]; 
     }); 
 

、問題がある:私は別のスレッドでのC++オブジェクトを作成し、このようなビットは、非同期コードにそれを渡す必要がありますメソッドが実行される前に破壊されたので、私は、ヒープ内のオブジェクトを作成してみました:


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

あなたはあまりにも早くmatを削除することができるので、new cv::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

アンサーに感謝します。私はヒープ内にオブジェクトを作成しても、私はまだ同じ問題を抱えています...オブジェクトリファレンスを期待するメソッドにどのように "ヒープオブジェクト"を渡すべきですか? cv :: Mat&mat)? – user361526

+0

ヒープオブジェクトの場合、この '[self processFrame:* mat];'のように渡すと、その呼び出しの直後に '' mat; ''を削除することができます。 – Joe

+0

これまでにも同じエラーがあります:(私はC++とObj-Cの混在を避けることができる別のライブラリを使用しようとします:) – user361526

関連する問題