
截屏2020-06-16 下午6.41.39.png
通過代碼說明上述圖片的問題:
import Foundation
typealias Fn = (Int) -> Int
func getFn() -> Fn { //代碼段
var num = 0 //局部變量
print(Mems.ptr(ofVal: &num)) //堆區(qū): 0x0000000100506ca0
func plus(_ i: Int) -> Int {
//實(shí)例對(duì)象內(nèi)存結(jié)構(gòu)默認(rèn)為(isa指針地址,引用計(jì)數(shù)地址,其他局部變量組成)開辟的空間為16的倍數(shù)
//捕獲外部局部變量時(shí),會(huì)生成一塊堆空間存儲(chǔ)外部變量(此時(shí)內(nèi)存結(jié)構(gòu)與實(shí)例對(duì)象內(nèi)存結(jié)構(gòu)相似), 內(nèi)部不進(jìn)行捕獲的時(shí)候它在棧空間,如果是全局變量,是不會(huì)重新生成堆空間的
num = num + i
print(Mems.ptr(ofVal: &num)) //堆區(qū): 0x0000000100506ca0
return 0
}
return plus
}
var fn1 = getFn() //初始化閉包對(duì)象
fn1(2)
print("fn1變量的內(nèi)存地址:\(Mems.ptr(ofVal: &p))") // 全局區(qū)(靜態(tài)區(qū) 0x0000000100009470
print("fn1變量指向的內(nèi)存地址:\(Mems.ptr(ofRef: p))") // 堆 0x0000000102919e30
class B {}
class A {
var num = 0
func test() {
print(Mems.ptr(ofVal: &num)) //堆 0x0000000102287ab0
var p = B()
print("p變量的內(nèi)存地址:\(Mems.ptr(ofVal: &p))") //棧 0x00007ffeefbff308
print("p變量指向的內(nèi)存地址:\(Mems.ptr(ofRef: p))") //堆 0x000000010392c110
}
}
var p = A()
p.test()
print("p變量的內(nèi)存地址:\(Mems.ptr(ofVal: &p))") //全局區(qū)(靜態(tài)區(qū)) 0x0000000100009470
print("p變量指向的內(nèi)存地址:\(Mems.ptr(ofRef: p))") //堆 0x0000000102919e30

截屏2020-06-11 下午7.06.35.png

截屏2020-06-11 下午7.11.53.png

截屏2020-06-11 下午7.17.27.png