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

时间:2019-09-13 14:39:34

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

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

library(microbenchmark)
library(DescTools)

set.seed(1789)
x <- sample(round(rnorm(1000), 3), 1e5, replace = TRUE)
bm <- microbenchmark(
            "!AllDuplicated(x)"             = !AllDuplicated(x),
            "!x %in% x[duplicated(x)]"      = !x %in% x[duplicated(x)]
      )
print(bm , unit="relative" , digits=3 , order="median" )

Unit: relative
                     expr  min   lq mean median   uq   max neval cld
        !AllDuplicated(x) 1.00 1.00 1.00   1.00 1.00 1.000   100   a
 !x %in% x[duplicated(x)] 1.44 1.43 1.16   1.45 1.52 0.143   100   a

1 个答案:

答案 0 :(得分:2)

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