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 內存地址要小,說明已初始化的額全局變量和靜態變量是挨著的,全局變量是放在數據區的。從上面的打印能看出來,地址是從低地址到高地址,堆空間的地址是越分配越大,棧是越來越小。