iOS 内存布局
2020-02-22 本文已影响0人
孙掌门
iOS 内存布局
--------高--------
内核
栈
堆
数据段(字符串常亮,已初始化的数据,未初始化的数据等)
代码段
保留
--------低--------
-
代码段,就是我们的程序在编译的时候都会转化为010101这样的代码,然后就放在内存的代码段这个区域
-
数据段,包括常量和初始化,未初始化的,比如
NSString *s = @"123";
NSString *s1 = @"123";
NSLog(@"%p %p",s,s1);
他们的打印是一样的,因为都指向“123”那个数据区。
然后就是已初始化的数据区,包括已初始化的全局变量,静态变量。
接下来就是未初始化的全局变量和静态变量
- 堆,alloc,malloc,calloc
- 栈(由高地址到低地址),函数调用开销,比如局部变量
// 已初始化的全局变量
int a = 10;
// 未初始化的全局变量
int b = 0;
- (void)testMemory{
// 已初始化的静态变量
static int c = 20;
// 未初始化的静态变量
static int d ;
// 已初始化的局部变量
int e = 30;
//未初始化的局部变量
int f;
// 对象
NSObject *obj = [[NSObject alloc] init];
// 字符串常量
NSString *str = @"123";
NSLog(@"a=%p",&a);
NSLog(@"b=%p",&b);
NSLog(@"c=%p",&c);
NSLog(@"d=%p",&d);
NSLog(@"e=%p",&e);
NSLog(@"f=%p",&f);
NSLog(@"obj=%p",&obj);
NSLog(@"str=%p",&str);
}
我们将打印结果排下
a=0x1086974e8
c=0x1086974ec
b=0x1086976b8
d=0x1086976a8
2020-02-22 14:35:37.426457+0800 blogTest[29949:1532803] a=0x1086974e8
2020-02-22 14:35:37.426618+0800 blogTest[29949:1532803] b=0x1086976b8
2020-02-22 14:35:37.426747+0800 blogTest[29949:1532803] c=0x1086974ec
2020-02-22 14:35:37.426853+0800 blogTest[29949:1532803] d=0x1086976a8
2020-02-22 14:35:37.426963+0800 blogTest[29949:1532803] e=0x7ffee757519c
2020-02-22 14:35:37.427070+0800 blogTest[29949:1532803] f=0x7ffee7575198
2020-02-22 14:35:37.427171+0800 blogTest[29949:1532803] obj=0x7ffee7575190
2020-02-22 14:35:37.427282+0800 blogTest[29949:1532803] str=0x7ffee7575188
可以看到,a 比 c 内存地址要小,说明已初始化的额全局变量和静态变量是挨着的,全局变量是放在数据区的。从上面的打印能看出来,地址是从低地址到高地址,堆空间的地址是越分配越大,栈是越来越小。