天天看點

Swift記憶體布局以及HandyJSON

1 記憶體分區

在一個程序在執行過程中作業系統會為其配置設定一塊兒記憶體,為了更好的管理這塊配置設定的記憶體。通常會把其劃分為棧區,靜态區,堆區。這裡不在說明各個區的差别。

2 swift 記憶體管理

swift中值類型包括數值類型(Int,float),集合類型(array,dictionary,set),結構體,枚舉的instance通常都是存在棧區的。class類型的instance存儲在堆區。堆區的記憶體開辟以及銷毀通過引用計數機制進行管理(與OC一緻)。

3 HeapObject

swift中每一個堆區對象都有兩個成員變量,meteData元類型以及引用計數。

Swift記憶體布局以及HandyJSON
class frame{

    var width:Int = 200

    var height:CGFloat = 2

   func headPointerOfClass() -> UnsafeMutablePointer<Int8> {
        
        let opaquePointer = Unmanaged.passUnretained(self as AnyObject).toOpaque()
        
        let mutableTypePointer = opaquePointer.bindMemory(to: Int8.self, capacity: MemoryLayout<frame>.stride)
    
        return UnsafeMutablePointer<Int8>(mutableTypePointer)
    }
}




let ftype = frame.self

var f1 = frame.init()

f1.width = 300

let rawp = UnsafeMutableRawPointer(f1.headPointerOfClass())

rawp.advanced(by: 16).assumingMemoryBound(to: Int.self).initialize(to: 400)

f1.width //輸出400 證明width的偏移量是16個位元組
           

4 swift中繼資料

swift每一種類型都有屬于“自己”的中繼資料。通過中繼資料可以擷取該類型的類型資訊包括所有屬性,V-table等等,HandyJSON動态擷取模型類的屬性就是用到了該技術。

4.1 中繼資料分類

下面兩張圖分别出自handyjson和swiftABI中中中繼資料類型的定義且對于每種類型的定義完全一緻。

Swift記憶體布局以及HandyJSON
Swift記憶體布局以及HandyJSON

4.2 description

每一個類型的中繼資料結構體都會有一個Description成員變量。通過description可以擷取該類型的存儲屬性個數,以及偏移量。

Swift記憶體布局以及HandyJSON