结构体

结构体的初始化器

思考:下面代码能编译通过么?

自定义初始化器

窥探初始化器的本质

结构体内存结构
struct Point {
var x: Int = 0
var y: Int = 0
var origin: Bool = false
}
print(MemoryLayout<Point>.size) // 17
print(MemoryLayout<Point>.stride) // 24
print(MemoryLayout<Point>.alignment) // 8
类

类的初始化器

结构体跟类的本质区别

类需要分配堆空间,结构体不需要分配
值类型

值类型的赋值操作

- 在Swift标准库中,为了提升性能,String、Array、Dictionary、Set采取了Copy On Write的技术
1、比如仅当有“写”操作时,才会真正执行拷贝操作
2、对于标准库值类型的赋值操作,Swift 能确保最佳性能,所有没必要为了保证最佳性能来避免赋值 - 建议:不需要修改的,尽量定义成let

对象的堆空间申请过程
- 在Swift中,创建类的实例对象,要向堆空间申请内存,大概流程如下
*Class.__allocating_init()
*libswiftCore.dylib:swift_allocObject
*libswiftCore.dylib:swift_slowAlloc
*libsystem_malloc.dylib:malloc - 在Mac、iOS中的malloc函数分配的内存大小总是16的倍数
- 通过class_getInstanceSize可以得知:类的对象至少需要占用多少内存
引用类型

引用类型的赋值操作

值类型、引用类型的let

嵌套类型

枚举、结构体、类都可以定义方法

- 方法占用对象的内存么?
1、不占用
2、方法的本质就是函数
3、方法、函数都存放在代码段
网友评论