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

 

  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值