1、内存布局
iOS内存布局如下图所示:
各自保存数据信息:
代码段 | 编译之后的代码,比如main.m中的代码,编译后会放在数据段。 |
---|---|
数据段 | 字符串常量:比如NSString *str = @”123” 已初始化数据:已初始化的全局变量、静态变量等 未初始化数据:未初始化的全局变量、静态变量等 |
栈 | 函数调用开销,比如局部变量。分配的内存空间地址越来越小。 |
堆 | 通过alloc、malloc、calloc等动态分配的空间,分配的内存空间地址越来越大 |
。 |
2、验证
通过分别创建不同的变量,打印各自地址,产看内存分布情况:
// 数据段:2已初始化的全局变量
int a = 1;
// 数据段:3未初始化的全局变量
int b;
- (void)viewDidLoad {
[super viewDidLoad];
// 数据段:1字符串常量
NSString *str = @"123";
// 数据段:2已初始化的静态变量
static int c = 1;
// 数据段:3未初始化的静态变量
static int d;
// 栈:局部变量(地址越来越小)
int e = 1;
int f = 2;
// 堆:alloc的对象(地址越来越大)
NSObject *obj1 = [[NSObject alloc] init];
NSObject *obj2 = [[NSObject alloc] init];
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);
}
查看内存地址:
数据段:字符串常量
str = 0x10d4ef020
数据段:已初始化的静态变量、全局变量
&a = 0x10d4f44c0
&c = 0x10d4f44c4
数据段:未初始化的静态变量、全局变量
&d = 0x10d4f4648
&b = 0x10d4f464c
堆:
obj1 = 0x600002190320
obj2 = 0x600002190330
栈:局部变量
&e = 0x7ffee2711264
&f = 0x7ffee2711260
可以发现字符串保存在数据段,且内存地址最小,向上依次是已初始化的静态变量/全局变量、未初始化的静态变量/全局变量、alloc出来的对象、局部变量。