2016-11-09 16 views
1

Objective-C++メソッド内にstd::functionを作成して、それをC++メソッドに渡そうとしています。Objective-C++からC++メソッドにstd ::関数を渡す方法

しかし、私は不正なアクセス例外を取得しています。私は、Objective-Cのブロックとラムダを使用して試してみた:

ブロックを使用する:

std::function<void(void)> callback = ^{ 
    [self doSomething]; 
}; 

callback(); // <-- this works 

self.myCppObject-> setButtonCallback(callback); 

ラムダを使用する:

私のC++クラスで
std::function<void()> callback = [self]() { 
    [self doSomething]; 
}; 

callback(); // <-- this works 

self.myCppObject->setButtonCallback(callback); 

void MyCppClass::setButtonCallback (std::function<void()> callback) 
{ 
    buttonCallback = std::move (callback); // <-- crash here 
} 

Objective-C++クラスにcallbackをプロパティとして格納しようとしました:

@property (nonatomic, assign) std::function<void()> callback; 

は、例外がスローされ、ここで:C++メソッドでコールバックの割り当てから来ている(<functional>からライン1717)

template<class _Rp, class ..._ArgTypes> 
function<_Rp(_ArgTypes...)>& 
function<_Rp(_ArgTypes...)>::operator=(function&& __f) _NOEXCEPT 
{ 
    if (__f_ == (__base*)&__buf_) // <-- EXC_BAD_ACCESS here 
     __f_->destroy(); 
    else if (__f_) 
     __f_->destroy_deallocate(); 
    __f_ = 0; 

    ... 

。私はstd::moveとコピーを=で使ってみました。それはそのコンストラクタでそれを初期化クラスのサブクラスだったとして

UPDATE

問題が[super initWith...]するのではなく、しかし、私はベース[super init]を呼んでいた、myCppObjectが初期化されていないことであることが判明しました私が必要だった。手がかりのために@Romanに感謝します。

+0

正確に例外がスローされますか? – SingerOfTheFall

+0

@SingerOfTheFall info added – Adamski

答えて

2

あなたのコードを実行しようとしましたが、前にプロパティself.myCppObjectが初期化されていない場合にのみ、同じエラーが発生しました。

self.myCppObject = new MyCppClass(); 
self.myCppObject-> setButtonCallback(callback); 

たり、適切に初期化プロパティself.myCppObjectかどうかを確認して

self.myCppObject-> setButtonCallback(callback); 

を交換してみてください。

+0

興味深いことに、 'myCppObject'はこのクラスに渡される前に初期化されているはずです。おそらく初期化の順序と関係があります。明日、調査します。 – Adamski

関連する問題