objectivec/swift 程序内存

文章目录
  1. 1. 程序的内存布局
  2. 2. Tagged Pointer
  3. 3. copy
  4. 4. autoreleasePool

程序的内存布局

程序内存地址

  1. 代码段 __TEXT:编译之后的代码
  2. 数据段 __DATA
    1. 字符串常量:比如NSString *str = @“123”
    2. 已初始化数据:已初始化的全局变量、静态变量等
    3. 未初始化数据:未初始化的全局变量、静态变量等
  3. 栈stack:函数调用开销,比如局部变量。分配的内存空间地址越来越小
  4. 堆heap:通过alloc、malloc、calloc等动态分配的空间,分配的内存空间地址越来越大

Tagged Pointer

从64bit开始,iOS引入了Tagged Pointer技术,用于优化NSNumber、NSDate、NSString等小对象的存储

  • 没使用 tagged pointer 技术之前

在没有使用Tagged Pointer之前, NSNumber等对象需要动态分配内存、维护引用计数等,NSNumber指针存储的是堆中NSNumber对象的地址值

  • 使用 tagged pointer 技术之后

使用Tagged Pointer之后,NSNumber指针里面存储的数据变成了:Tag + Data,也就是将数据直接存储在了指针中

当指针不够存储数据时,才会使用动态分配内存的方式来存储数据

objc_msgSend内部判断Tagged Pointer类型,比如NSNumber的intValue方法,直接从指针提取数据,节省了以前的调用开销

copy

拷贝的目的:产生一个副本对象,跟源对象互不影响

iOS提供了2个拷贝方法

  1. copy,不可变拷贝,产生不可变副本
  2. mutableCopy,可变拷贝,产生可变副本

深拷贝和浅拷贝

  1. 深拷贝:内容拷贝,产生新的对象
  2. 浅拷贝:指针拷贝,没有产生新的对象

copy

autoreleasePool

autoreleasePool