浅析swift的类型属性(type property)

image.png

一:
如上代码,num1,num3都是全局变量,然后Person里面定义了一个类型属性age。打断点查看:


image.png

通过代码上我们的赋值,10,11,12可以猜测到哪个是给num1,Person.age,num3赋值的汇编指令,通过计算和打印得到这三个地址为:0x100006300,0x100006308,0x100006310,可得知这是三个连续的地址,所以num1,Person,.age,num3是在同一块连续的地址中,因num1,num3又是全局变量,所以暂时可得出结论是Person.age也是类似于全局变量般的存在,并且有且只有一份.

猜想1:回想起上一篇文章,假如在枚举里定义类型属性,枚举占用内存空间也是不变的,所以在枚举,类,结构体里定义类型属性,虽看起来是类,枚举,结构体所拥有,但只是单纯的一种访问权限设置,而不是类似于oc的类方法,存在于唯一的meta-class对象里的拥有关系?

二:
把断点打在124行,进入汇编指令


image.png

进入call调用的方法里


image.png

第11行,一般rax存放的都是函数返回值,我们打印rax地址为0x0000000100006308,然后再查看该地址所存的值为0D(即13,为我们在Person里给age的赋值):


image.png

然后在第9行的汇编里可以看到注释swift_once,这让人想起了dispatch_once,可以进入第九行所调用的函数里查看,可以看到它最终调用的也就是dispatch_once,可以得知,类型属性它是线程安全的,实现的方式是使用的GCD的dispat_once,所以也解释了,假如定义一个Person的单例,只需要如第一张图的120行写法就能实现。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

友情链接更多精彩内容