swift 枚举

image.png

Password是有关联值的枚举类型,打印得知系统给它分配了40字节空间,实际使用33字节。

其中item2是关联了最多值的选项.查看p的内存:


image.png

p1的内存:


image.png

关于p:前32字节分为4部分(Int占8字节),分别存值 3,4,5,6 ,最后那8字节存的值为1。
关于p1:前8字节存值8,然后最后8字节为0

结论:由于item2选项是关联最多值的(所需空间也最大),所以Password的空间大小最后有item2来决定。其中前32字节存的是关联值,最后还需要一个字节来存储当前枚举所选项,由于内存对齐为8,最终系统分配40字节。

Season是设置原始值的枚举,有四个元素,其元素winter的值应为 258,但打印得知系统只给Season分配了一个字节,0XFF = 256 ,一个字节最大能存的数字为256,winter 258已超出,所以猜想Season的内存结构不是存着四个个Int的数字,而且Int占8个字节.
查看Season的内存:


image.png

第一个字节只存在一个3 ,是winter的序号。但每个项都有一个值得,那这些值存在哪里?
猜想是通过Season里的类似于getValue 方法来存储获取值。因为方法是在代码区的,所以不占用Season的内存,故Season只需要1个字节。也可以断点打到取值s.rawValue那一行,可以看到汇编


image.png

Season.rawValue.getter 是通过计算属性的方式来获取原始值的,计算属性也就类似于方法。
那假如Season有258个选项的话那就不止占用1个字节了吧。

所以:枚举的内存只是用来存储case和关联值,这也就是枚举里面不能定义属性(存储属性)的原因?

你可能感兴趣的:(swift 枚举)