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に感謝します。
正確に例外がスローされますか? – SingerOfTheFall
@SingerOfTheFall info added – Adamski