iOS 內存布局

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

?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容