objective-c - 如何在 c++ lambda 调用中正确捕获 Obj-C block ?

标签 objective-c c++11 lambda objective-c-blocks objective-c++

我们最近将 Obj-c 应用程序移植到 C++ 跨平台。我们正在将它重新集成到 iOS 中,并且必须将一个块和 NSObject 捕获到一个 lambda 中,这让我非常紧张,因为我不知道它是否会正确保留内存。这是一些测试代码

NSString* important_string = @"Test String";
void (^important_os_callback)(parameterTypes parameter);

my_cpp_function_with_lamdba([important_string, important_os_callback]()
{
    // Are the block and string still retained later?
    important_os_callback(important_string);
});

最佳答案

是的,它会正常工作。 C++ lambda 等效于创建一个未命名的结构类型,并将捕获的变量作为字段。 ARC 确保当 C++ 结构的字段具有 Objective-C 对象指针类型(或块指针类型)时,它将遵循 ARC 语义,即结构的构造函数会将字段初始化为 nil ;当有人分配给该字段时,它会释放先前的值并保留(或复制,如果它是一个块)新值;并且结构的析构函数将释放该字段。

关于objective-c - 如何在 c++ lambda 调用中正确捕获 Obj-C block ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57925717/

相关文章:

ios - 点击 `Add Tags` 选项会关闭 UIDocumentInteractionController 突然启动的底层模态视图

ios - 无法向 Twilio 可编程聊天中的 channel 添加属性?

node.js - DynamoDB 支持的 NodeJS lambda 函数的输入验证

c++ - C++11 中的线程池

c++ - 额外的模板参数导致重载歧义

c++ - 在 C++ 中推断 lambda 的模板类型

c++ - 如何使用模板将 lambda 转换为 std::function

ios - 如何在 objective-c 中比较自定义 sqlite 排序规则中的字符?

ios - 如何切换 ios 导航栏中的额外按钮?

c++ - 无法在 Boost.Log 中设置控制台日志的格式