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

How can I properly capture an Obj-C block within a c++ lambda call?

我们最近将我们的 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;当有人分配给该字段时,它会释放以前的值并保留(或复制,如果它是一个块)新值;结构的析构函数将释放该字段。