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