单例对象的内存分配位置解析及自定义分配流程正确性验证
关于Swift单例内存分配的细节解析
嘿,你的理解核心方向是对的,但有一处关键细节需要修正,咱们把整个流程拆解开讲清楚:
你的正确理解部分
let myClass这个常量如果是局部变量(比如在函数内部定义),它确实会被分配在**栈(Stack)**中,存储的是一个指向堆(Heap)中MyClass实例的指针。MyClass.shared静态属性指向的MyClass()单例实例,确实是分配在**堆(Heap)**中的——因为类的实例在Swift里都是引用类型,默认都会在堆上分配内存。
需要修正的误区
你提到“MyClass.shared静态属性指向在堆(Heap)中分配的MyClass()实例”这句话后半段是对的,但静态属性shared本身的存储位置并不是堆:
- Swift中,类型的静态属性(包括
static let)属于类型关联的全局存储,会被分配在全局静态存储区,而不是堆。这个区域的内存会在程序启动时(或第一次访问该属性时)分配,直到程序退出才会释放,用来存储静态属性的值(这里就是指向堆中实例的指针)。
完整的分配流程梳理
- 当程序第一次访问
MyClass.shared时,会触发MyClass()的初始化,这个类实例会被分配在堆上; - 静态属性
shared(位于全局静态存储区)会存储这个堆实例的指针; - 当你定义
let myClass = MyClass.shared时,如果这是局部变量,myClass会被分配在栈上,同时复制shared存储的指针值,最终两个指针都指向堆中同一个单例实例。
内容的提问来源于stack exchange,提问作者LJoy
相关产品推荐
相关产品推荐

