9

ObjectiveC++プロジェクトがあります。ObjectiveCのコンテキストでは、ARCとiPhoneSDK6を使用しています。C++では、C++11コンパイラを使用しています。

C ++ 11のLambda関数は、参照を使用して変数をキャプチャしています。この概念はObjectiveCでは実際にはサポートされておらず、「試行錯誤」によって次の解決策を思いつきました。私が気付いていない落とし穴はありますか?

この問題に対するより良い解決策はありますか?

typedef std::function<void ()> MyLambdaType;

...
// m_myView will not go away. ARC managed.
UIView * __strong m_myView;

...
// In Objective C context I create a lambda function that calls my Objective C object
UIView &myViewReference = *m_myView;
MyLambdaType myLambda = [&myViewReference]() {
    UIView *myViewBlockScope = &myViewReference;
    // Do something with `myViewBlockScope`
}

..
// In C++11 context I call this lambda function
myLambda();
4

1 に答える 1

17

簡単なことは、ラムダにオブジェクトポインター変数をキャプチャさせm_myView(スニペットから、これはローカル変数であると想定しています)、ラムダ内で通常どおり使用することです。

MyLambdaType myLambda = [m_myView]() {
    // Do something with `m_myView`
}

唯一の懸念は、のメモリ管理ですm_myView。一般的に正しくするには、ラムダは作成時に保持し、破棄時に解放する必要があります (ラムダは存在しないm_myViewスコープで使用できるため、ブロックと同じように)。m_myView

ARCドキュメントを読んで、この状況が具体的に言及されているとは思いませんが、(1) C++11ラムダのキャプチャされた変数は匿名クラスのフィールドとして格納されるため、適切に処理する必要があると思います。ラムダが構築されるときにキャプチャされた値に初期化され、(2) ARC は、構築および破棄時に C++ クラスの Objective-C オブジェクト フィールドの保持および解放を適切に処理します。逆にラムダについて具体的に何かを述べているか、コンパイラのバグがない限り、動作しない理由はわかりません。

于 2012-10-29T20:19:26.867 に答える