类和结构体

前言

类和结构体在写法上有相似的地方,但是也有一些不同,在swift中,有值类型和引用类型,值类型包括结构体和枚举,值类型占了大部分,而类只有小部分,这里主要做一下关键性的记录,方便以后回顾查阅。

结构体

结构体的内存结构大小由成员变量的大小构成,系统会按照架构分配大小内存。

截屏2022-05-31 10.40.07.png

结构体可能会生成多个初始化器,来保证你的每个成员都有值,nil也是初始值。

截屏2022-05-31 10.37.44.png

自定义初始化器只需要写init函数即可,不要返回值,也不用写func关键字。

当你写了自定义初始化器以后,编译器将不会自动帮你生成初始化器。

截屏2022-05-31 10.41.05.png

编译器不会为类生成可以传入成员值的初始化器,如果你的成员都有初始化过了,那么会生成一个无参初始化器。

截屏2022-05-31 10.44.01.png

区别

如果是在函数内声明,那么结构体类型会分配在栈空间,并且是连续的内存空间,存储的就是结构体的成员,而在方法内声明的类对象,他在栈上只占八个字节,它就是一个引用变量,里面存的是它指向堆空间实际对象的地址。

扫描二维码关注公众号,回复: 14275023 查看本文章

如果在外部声明,那么结构体变量分配在外部,或者是全局区,看你在哪里声明

截屏2022-05-31 10.52.33.png

值类型

copyOnWrite

在swift中,针对string、array,dictionary、set,为了提升性能,只有在修改值类型的时候,才会进行深度拷贝。自己定义的结构体类型不存在这个机制,所以修改是覆盖操作。

赋值区别

截屏2022-06-07 14.24.52.png

同样是定义了一个常量,结构体常量p,因为内存中就包含了成员,所以里面的数据都不能修改,如果是引用类型,s的内容是指向堆空间的地址,这个地址是无法修改的,所以无法再指向别的地址,但是堆空间里的内容是可以修改的。

对于一个对象占用的内存大小分析

任何一个类对象,前面都会有16字节预留存放一些指针等数据,后面才是成员变量,实际利用的是33字节,但是为了满足八字节对齐,所以这个对象至少需要40个字节才能使用,但是又因为他在堆空间,堆空间默认分配都是16的倍数,所以实际分配给的是48个字节。

截屏2022-06-07 14.59.26.png

猜你喜欢

转载自juejin.im/post/7106391440132931614
今日推荐