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