前言
类和结构体在写法上有相似的地方,但是也有一些不同,在swift中,有值类型和引用类型,值类型包括结构体和枚举,值类型占了大部分,而类只有小部分,这里主要做一下关键性的记录,方便以后回顾查阅。
结构体
结构体的内存结构大小由成员变量的大小构成,系统会按照架构分配大小内存。
结构体可能会生成多个初始化器,来保证你的每个成员都有值,nil也是初始值。
自定义初始化器只需要写init函数即可,不要返回值,也不用写func关键字。
当你写了自定义初始化器以后,编译器将不会自动帮你生成初始化器。
类
编译器不会为类生成可以传入成员值的初始化器,如果你的成员都有初始化过了,那么会生成一个无参初始化器。
区别
如果是在函数内声明,那么结构体类型会分配在栈空间,并且是连续的内存空间,存储的就是结构体的成员,而在方法内声明的类对象,他在栈上只占八个字节,它就是一个引用变量,里面存的是它指向堆空间实际对象的地址。
如果在外部声明,那么结构体变量分配在外部,或者是全局区,看你在哪里声明
。
值类型
copyOnWrite
在swift中,针对string、array,dictionary、set,为了提升性能,只有在修改值类型的时候,才会进行深度拷贝。自己定义的结构体类型不存在这个机制,所以修改是覆盖操作。
赋值区别
同样是定义了一个常量,结构体常量p,因为内存中就包含了成员,所以里面的数据都不能修改,如果是引用类型,s的内容是指向堆空间的地址,这个地址是无法修改的,所以无法再指向别的地址,但是堆空间里的内容是可以修改的。
对于一个对象占用的内存大小分析
任何一个类对象,前面都会有16字节预留存放一些指针等数据,后面才是成员变量,实际利用的是33字节,但是为了满足八字节对齐,所以这个对象至少需要40个字节才能使用,但是又因为他在堆空间,堆空间默认分配都是16的倍数,所以实际分配给的是48个字节。