1、内存布局

iOS内存布局如下图所示:
image.png
各自保存数据信息:

代码段 编译之后的代码,比如main.m中的代码,编译后会放在数据段。
数据段 字符串常量:比如NSString *str = @”123”
已初始化数据:已初始化的全局变量、静态变量等
未初始化数据:未初始化的全局变量、静态变量等
函数调用开销,比如局部变量。分配的内存空间地址越来越小。
通过alloc、malloc、calloc等动态分配的空间,分配的内存空间地址越来越大

。 |

2、验证

通过分别创建不同的变量,打印各自地址,产看内存分布情况:

  1. // 数据段:2已初始化的全局变量
  2. int a = 1;
  3. // 数据段:3未初始化的全局变量
  4. int b;
  5. - (void)viewDidLoad {
  6. [super viewDidLoad];
  7. // 数据段:1字符串常量
  8. NSString *str = @"123";
  9. // 数据段:2已初始化的静态变量
  10. static int c = 1;
  11. // 数据段:3未初始化的静态变量
  12. static int d;
  13. // 栈:局部变量(地址越来越小)
  14. int e = 1;
  15. int f = 2;
  16. // 堆:alloc的对象(地址越来越大)
  17. NSObject *obj1 = [[NSObject alloc] init];
  18. NSObject *obj2 = [[NSObject alloc] init];
  19. NSLog(@"\n &a = %p\n &b = %p\n &c = %p\n &d = %p\n &e = %p\n &f = %p\n str = %p\n obj1 = %p\n obj2 = %p\n",&a,&b,&c,&d,&e,&f,str,obj1,obj2);
  20. }

查看内存地址:

  1. 数据段:字符串常量
  2. str = 0x10d4ef020
  3. 数据段:已初始化的静态变量、全局变量
  4. &a = 0x10d4f44c0
  5. &c = 0x10d4f44c4
  6. 数据段:未初始化的静态变量、全局变量
  7. &d = 0x10d4f4648
  8. &b = 0x10d4f464c
  9. 堆:
  10. obj1 = 0x600002190320
  11. obj2 = 0x600002190330
  12. 栈:局部变量
  13. &e = 0x7ffee2711264
  14. &f = 0x7ffee2711260

可以发现字符串保存在数据段,且内存地址最小,向上依次是已初始化的静态变量/全局变量、未初始化的静态变量/全局变量、alloc出来的对象、局部变量。