gpt4 book ai didi

objective-c - 在 ARC ObjectiveC++ 中使用 C++11 lambda 函数——如何正确使用?

转载 作者:太空狗 更新时间:2023-10-30 03:31:41 27 4
gpt4 key购买 nike

我有一个 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();

最佳答案

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

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

唯一需要注意的是m_myView 的内存管理。一般而言,lambda 需要在创建时保留 m_myView,并在销毁时释放它(就像 block 一样;因为 lambda 可以在 m_myView 的范围内使用 不存在)。

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

关于objective-c - 在 ARC ObjectiveC++ 中使用 C++11 lambda 函数——如何正确使用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13082555/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com