iOS 内存布局

2020-02-22  本文已影响0人  孙掌门

iOS 内存布局

--------高--------

内核

栈

堆

数据段(字符串常亮,已初始化的数据,未初始化的数据等)

代码段

保留

--------低--------

  1. 代码段,就是我们的程序在编译的时候都会转化为010101这样的代码,然后就放在内存的代码段这个区域

  2. 数据段,包括常量和初始化,未初始化的,比如


NSString *s = @"123";
    NSString *s1 = @"123";
    NSLog(@"%p %p",s,s1);

他们的打印是一样的,因为都指向“123”那个数据区。

然后就是已初始化的数据区,包括已初始化的全局变量,静态变量。

接下来就是未初始化的全局变量和静态变量

  1. 堆,alloc,malloc,calloc
  2. 栈(由高地址到低地址),函数调用开销,比如局部变量
// 已初始化的全局变量
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 内存地址要小,说明已初始化的额全局变量和静态变量是挨着的,全局变量是放在数据区的。从上面的打印能看出来,地址是从低地址到高地址,堆空间的地址是越分配越大,栈是越来越小。

上一篇下一篇

猜你喜欢

热点阅读