swift 一些底層筆記

block的一些原理

不包含局部變量和包含全局變量

當閉包內未包含局部變量時,其實跟函數一致,方法調用也是跟函數似的,拿到函數地址直接調用,函數存在於代碼段。當閉包只包含全局變量狀況也相似,能夠直接調用。數組

包含局部變量

以只含一個局部變量爲例:數據結構

當閉包包含局部變量時,須要在內存開闢一段堆空間。會申請24個字節,因內存對齊實際開闢32個字節。堆空間佈局和類很是相似。前8個字節存放函數地址,(中間8個字節存放引用計數),後8個字節存放copy局部變量的值。閉包

當調用閉包時,會取前8個字節也就是函數地址進行調用,這時內部默認會追加傳入一個參數給函數(即閉包的地址)。當函數使用到局部變量時就會以閉包地址加上16個字節(即copy的局部變量值)來進行使用。使用完畢再去更新堆上的變量值。函數

字符串

數組

String, Array 定義和行爲上是值類型,底層數據結構更接近引用類型。佈局

結構體

結構體數據直接放在結構體內存裏面。cdn

枚舉

枚舉關聯值直接保存在內存中,case在內存中只佔用一個字節,取rawValue時相似於方法調用,值不保存在枚舉對象中。對象

.self .type

class.self 指向類信息,和一個類實例對象前8個字節指向相同 class.type .self的類型 類的類型blog

相關文章
相關標籤/搜索