9

我有一个 ObjectiveC++ 项目。在 ObjectiveC 上下文中,我使用 ARC 和 iPhoneSDK 6。在 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

最简单的做法是让 lambda 捕获对象指针变量m_myView(我从您的代码片段中假设这是一个局部变量),并在 lambda 中正常使用它:

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

唯一需要考虑的是m_myView. 一般来说,lambda 需要在m_myView创建时保留,并在销毁时释放它(就像块一样;因为 lambda 可以在m_myView不存在的范围内使用)。

通读 ARC 文档,我没有看到具体提到这种情况,但我相信它应该正确处理它,因为 (1) 捕获的 C++11 lambda 变量存储为匿名类的字段,它们是在构造 lambda 时初始化为捕获的值,并且 (2) ARC 在构造和销毁时正确处理 C++ 类的 Objective-C 对象字段的保留和释放。除非它特别说明了有关 lambdas 的内容,或者存在编译器错误,否则我看不出它不应该工作的原因。

于 2012-10-29T20:19:26.867 回答