You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

单例对象的内存分配位置解析及自定义分配流程正确性验证

关于Swift单例内存分配的细节解析

嘿,你的理解核心方向是对的,但有一处关键细节需要修正,咱们把整个流程拆解开讲清楚:

你的正确理解部分

  • let myClass 这个常量如果是局部变量(比如在函数内部定义),它确实会被分配在**栈(Stack)**中,存储的是一个指向堆(Heap)中MyClass实例的指针。
  • MyClass.shared 静态属性指向的MyClass()单例实例,确实是分配在**堆(Heap)**中的——因为类的实例在Swift里都是引用类型,默认都会在堆上分配内存。

需要修正的误区

你提到“MyClass.shared静态属性指向在堆(Heap)中分配的MyClass()实例”这句话后半段是对的,但静态属性shared本身的存储位置并不是堆:

  • Swift中,类型的静态属性(包括static let)属于类型关联的全局存储,会被分配在全局静态存储区,而不是堆。这个区域的内存会在程序启动时(或第一次访问该属性时)分配,直到程序退出才会释放,用来存储静态属性的值(这里就是指向堆中实例的指针)。

完整的分配流程梳理

  1. 当程序第一次访问MyClass.shared时,会触发MyClass()的初始化,这个类实例会被分配在堆上;
  2. 静态属性shared(位于全局静态存储区)会存储这个堆实例的指针;
  3. 当你定义let myClass = MyClass.shared时,如果这是局部变量,myClass会被分配在栈上,同时复制shared存储的指针值,最终两个指针都指向堆中同一个单例实例。

内容的提问来源于stack exchange,提问作者LJoy

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.30 17:47:26