一:
如上代码,num1,num3都是全局变量,然后Person里面定义了一个类型属性age。打断点查看:
通过代码上我们的赋值,10,11,12可以猜测到哪个是给num1,Person.age,num3赋值的汇编指令,通过计算和打印得到这三个地址为:0x100006300,0x100006308,0x100006310,可得知这是三个连续的地址,所以num1,Person,.age,num3是在同一块连续的地址中,因num1,num3又是全局变量,所以暂时可得出结论是Person.age也是类似于全局变量般的存在,并且有且只有一份.
猜想1:回想起上一篇文章,假如在枚举里定义类型属性,枚举占用内存空间也是不变的,所以在枚举,类,结构体里定义类型属性,虽看起来是类,枚举,结构体所拥有,但只是单纯的一种访问权限设置,而不是类似于oc的类方法,存在于唯一的meta-class对象里的拥有关系?
二:
把断点打在124行,进入汇编指令
进入call调用的方法里
第11行,一般rax存放的都是函数返回值,我们打印rax地址为0x0000000100006308,然后再查看该地址所存的值为0D(即13,为我们在Person里给age的赋值):
然后在第9行的汇编里可以看到注释swift_once,这让人想起了dispatch_once,可以进入第九行所调用的函数里查看,可以看到它最终调用的也就是dispatch_once,可以得知,类型属性它是线程安全的,实现的方式是使用的GCD的dispat_once,所以也解释了,假如定义一个Person的单例,只需要如第一张图的120行写法就能实现。