Swift复习四&五

内存分析

结构体 类 值类型 引用类型

一: 汇编发展
截屏2022-04-14 上午8.24.57.png
二: 汇编语言种类
截屏2022-04-14 上午8.27.10.png
三: 常见指令
截屏2022-04-14 上午8.27.28.png
四: 寄存器
截屏2022-04-14 上午8.33.54.png
五: mov lea q是单位 8个bit
截屏2022-04-14 上午8.37.46.png
六: liulldb常见指令
截屏2022-04-14 上午9.08.27.png
七: 枚举赋值内存分析
截屏2022-04-13 下午6.01.30.png

截屏2022-04-14 上午9.27.46.png
八: 结构体

1 定义结构体
立即数大概等同于字面量


截屏2022-04-14 上午10.42.37.png
// 定义结构体
   struct Date { 
        var year: Int   // 不设置默认值是可以的
        var month: Int
        var day: Int
    }
 var date =  Date(year: 2001, month: 01, day: 01)
        print (date.year)
        print (date.month)
        print (date.day)
// 结构体会自动生成个初始化器

2 结构体设置初始化值

不管设置不设置结构体初始化值, 初始化时候必须保证所有值都初始化,否则编译报错


截屏2022-04-14 上午10.45.05.png

3 结构体设置可选类型 空也是默认类型


截屏2022-04-14 上午10.46.31.png

4 自定义初始化器
你自己定义了, 就覆盖了系统的, 只能调用自己的


截屏2022-04-14 上午10.48.37.png

5 结构体内存分析


截屏2022-04-14 上午10.54.16.png

// x.y各自占用8个字节


截屏2022-04-14 上午10.55.31.png

// x,y各自占用8个字节, bool占用一个 合计17个, 系统会有内存对齐8位,补齐所以是24个

重点: 结构体初始化必须保证全部成员初始化完毕,类也如此

九: 类

1 初始化器, 不同于结构体, 类不会自动生成可以添加成员变量的初始化器


截屏2022-04-14 上午11.00.18.png

2 初始化类
1 类需要给所有变量指定默认值 **重要
2 成员变量初始化完毕,会生产()初始化器
3 类初始化时候, 务必保证所有成员变量初始化完毕


截屏2022-04-14 上午11.02.20.png

3 结构体和类的本质区别
1 结构体值类型, 赋值是内容拷贝
2 类引用类型, 赋值是指针拷贝


截屏2022-04-14 下午1.32.48.png

分析:
1 函数地址存放在栈空间
2 point 值类型, 指针地址,内容地址都存放在栈空间
3 size 引用类型, 指针地址存放在栈空间,内容地址存放在堆空间

问题, 结构体存在哪? 看定义在哪?
1 定义在函数内: 栈空间
2 定义在类中: 堆空间
3 外面定义: 数据段

九: 值类型 引用类型

1值类型
值类型: 内容拷贝, 新旧变量修改, 不互相影响


截屏2022-04-14 下午1.38.50.png

值类型赋值
编译器优化, 如果没有修改操作 s1 s2指针指向的内容地址, 可能是同一块区域


截屏2022-04-14 下午1.41.37.png

截屏2022-04-14 下午1.43.52.png

2 引用类型
引用类型, 指针拷贝, 新变量修改会影响原变量的值


截屏2022-04-14 下午1.44.52.png

引用变量赋值


截屏2022-04-14 下午1.46.40.png

值类型& 引用类型 let


截屏2022-04-15 下午5.39.37.png

1 p: 属于值类型, 成员变量存放在结构体内部, 结构体占用16个字节, 包含成员变量的内存, p声明let所以, 所以p的指向的内存地址不能修改, p = Point(x:11, y:22) // 不能修改 x, y存放在结构体内部, p指向的内存不能修改, 所以 x, y也不能修改
2 s属于引用类型s占用8个字节, 声明let所以s指针指向的内存地址不能修改, 但是width, height不存在s内部, 所以可以修改
3 字符串, 数组都属于值类型, 定义let内存地址不能被修改

你可能感兴趣的:(Swift复习四&五)