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可以获取该类型的存储属性个数,以及偏移量。