Swift内存布局以及HandyJSON

Swift内存布局以及HandyJSON

1 内存分区

在一个进程在执行过程中操作系统会为其分配一块儿内存,为了更好的管理这块分配的内存。通常会把其划分为栈区,静态区,堆区。这里不在说明各个区的差别。

2 swift 内存管理

swift中值类型包括数值类型(Int,float),集合类型(array,dictionary,set),结构体,枚举的instance通常都是存在栈区的。class类型的instance存储在堆区。堆区的内存开辟以及销毁通过引用计数机制进行管理(与OC一致)。

3 HeapObject

swift中每一个堆区对象都有两个成员变量,meteData元类型以及引用计数。

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中中元数据类型的定义且对于每种类型的定义完全一致。

4.2 description

每一个类型的元数据结构体都会有一个Description成员变量。通过description可以获取该类型的存储属性个数,以及偏移量。