专注iOS开发的小渣渣

swift底层探索 03 - 值类型、引用类型

2020-12-17  本文已影响0人  Henry________

在swift中所有数据类型的无外乎两种:值类型,引用类型

先上个自己的简答理解:
* 值类型 : 在内存中直接保存值,有点类似oc中targetPoint
* 引用类型 : 在内存中保存指针地址;

1. 内存分区

在了解结构体和值类型之前一定要对内存的五大分区有一个基本的认识,这样才可以对这个概念有一个更准确的认识。

简书-月月
这幅图应该并不陌生,内存地址从低到高分别是:代码区常量区全局区堆区、栈区这五大区域。每一个界限都是一个人为划分和规定的。

通过lldb观察struct、class


xcode - Cat address

内存地址属于哪片区域,除了猜测还是有工具可以查看的;
基于lldb-plugin的内存分区查询插件-github

接入
  1. 根目录下关键.lldbinit

    iTerm
  2. 编辑lldbinit文件
    lldbinit文件中,添加语句:

plugin load /Users/***/libfooplugin.dylib(libfooplugin.dylib在你本机的绝对路径)
使用
cat address 0x000000

2. 值类型

结构体

struct PersonModel{
    var name : String = "henry"
    var age : Int = 18
    var phone : Int
}
观察一下结构体的sil文件

swift底层探索 02 - 属性一文中对sil文件的获取和使用做了解释,有兴趣可以去看看。

结构体初始化过程-sil

前面的结论还是比较抽象的,现在通过LLDB + MachOView,直观的来看下

顺序问题是结构化输出的原因造成的

使用一个结构体对另一个结构体进行赋值:


enum

enum personType {
    case yellow
    case white
    case black
}

[总结]

3. 引用类型-class

相比较值类型引用类型应该是无比的熟悉了。比如:NSObject,Class都是引用类型.

初始化方式

sil文件
类的初始化

[总结]

4. class、struct嵌套使用

引用计数

class teachModel{
    var age : Int = 18
    var age2 : Int = 20
}

struct PersonModel{
    var sub : teachModel
    var name : Int = 20
    var age : Int = 18
    
}
var a = PersonModel(sub: teachModel(), name: 1, age: 2)
var aa = a

内部值的情况

class teachModel{
    var age : Int = 18
}

struct PersonModel{
    var age : Int = 18
    var sub : teachModel = teachModel()
}
var a = PersonModel()
let aa = a
情况一
情况二
lldb验证

【总结】

上一篇 下一篇

猜你喜欢

热点阅读