闭包在其定义的上下文变量中捕获常量和变量,即使这些常量和变量的原域已经不存在了,闭包仍然可以在闭包函数体内引用和修改这些值。问题探究,到底原域消失之后,这些变量是复制了一份在闭包引用内,还是之前变量或者常量都复用
func test(){
let myincr = increatmFunStr(Other: "BOB")
print(myincr())
print(myincr())
print(myincr())
print(myincr())
}
//获取变量地址
func address(o:UnsafeRawPointer) -> String {
return String.init(format: "%018p", Int(bitPattern: o))
}
public func increatmFunStr(Other baseStr:String)->()->String{
var totostr:String = ""
print("FF baseStr-->" + address(o: baseStr))
print("FF totostr-->" + address(o: totostr))
func increat()->String{
totostr = totostr + baseStr
print("baseStr-->" + address(o: baseStr))
print("totostr-->" + address(o: totostr))
return totostr
}
return increat
}
执行结果
FF baseStr-->0x0000600000c46ed0
FF totostr-->0x0000600000c46f90
baseStr-->0x0000600000c46f90
totostr-->0x0000600000c46fc0
BOB
baseStr-->0x0000600000c46ed0
totostr-->0x0000600000c46f90
BOBBOB
baseStr-->0x0000600000c46fc0
totostr-->0x0000600000c46ed0
BOBBOBBOB
baseStr-->0x0000600000c46f90
totostr-->0x0000600000c46fc0
BOBBOBBOBBOB
地址确实变化了,复制了一份副本