天天看點

iOS記憶體管理02-記憶體布局One More Thing

這一階段我們主要來講講iOS記憶體管理方面的知識,面試的時候可能大家多多少少都會被問及這方面的問題,那我們就從常見的面試題開講
  • 使用

    CADisplayLink

    NSTimer

    有什麼注意點?
  • 介紹下記憶體的幾大區域
  • 講一下你對iOS記憶體管理的了解
  • ARC

    都幫我們做了什麼?
  • weak指針

    的實作原理
  • autorelease

    對象在什麼時機會被調用

    release

  • 方法裡有局部對象,出了方法後會

    立即釋放

    嗎?

上一篇我們說了

定時器

CADisplayLink

,今天我們來說說第二條,介紹下

iOS的記憶體布局

iOS記憶體管理02-記憶體布局One More Thing

##我們從低向高看依次是

  • 記憶體的低位址是保留的
  • 代碼段(__TEXT)
編譯之後的代碼
  • 資料段(__DATA)

字元串常量:比如NSString *str = @“123”

已初始化資料:已初始化的全局變量、靜态變量等

未初始化資料:未初始化的全局變量、靜态變量等

  • 堆(heap)
通過

alloc

malloc

calloc

等動态配置設定的空間,配置設定的記憶體空間位址

越來越大

  • 棧(stack)
函數調用開銷,比如

局部變量

。配置設定的記憶體空間位址

越來越小

  • 核心區

保留區和核心區我們是用不到的

##下面我們來寫代碼驗證下

我們建立一個工程,我們就直接在main檔案裡直接寫了

int a = 10;
int b;

int main(int argc, char * argv[]) {
    @autoreleasepool {
        static int c = 20;
        
        static int d;
        
        int e;
        int f = 20;

        NSString *str = @"123";
        
        NSObject *obj = [[NSObject alloc] init];
        
        NSLog(@"\n&a=%p\n&b=%p\n&c=%p\n&d=%p\n&e=%p\n&f=%p\nstr=%p\nobj=%p\n",
              &a, &b, &c, &d, &e, &f, str, obj);
        
        return UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class]));
    }
}
           

然後我們運作下看終端日志輸出

/*
 字元串常量
 str=0x10dfa0068
 
 已初始化的全局變量、靜态變量
 &a =0x10dfa0db8
 &c =0x10dfa0dbc
 
 未初始化的全局變量、靜态變量
 &d =0x10dfa0e80
 &b =0x10dfa0e84
 
 堆
 obj=0x608000012210
 
 棧
 &f =0x7ffee1c60fe0
 &e =0x7ffee1c60fe4
 */
           

我們可以看到跟我們畫的圖是一樣的

  • 字元串常量的記憶體位址 < 已初始化的全局變量、靜态變量 < 未初始化的全局變量、靜态變量 < 堆 < 棧
  • 我們還發現

    全局變量

    靜态變量

    的記憶體位址是

    挨着的

    ,是以我們可以說

    靜态變量

    (不管放在那裡方法内部也好外部也好)和

    全局變量

    是一樣的記憶體是

    隻有一份

    的,編譯完以後它們就已經确定了放在了一塊的
  • 還有就是我們看到

    資料段

    的位址跨度非常大,是以系統留給我們的

    的空間是

    非常大

  • 還有一點就是由于

    配置設定的空間位址

    越來越大

    ,而

    配置設定的空間位址

    越來越小

    ,也就是說

    之間的位址有可能是

    堆空間

    ,也可能是

    棧空間

One More Thing

喜歡的朋友可以掃描關注我的公衆号(多多點贊,多多打賞,您的支援是我寫作的最大動力)

iOS記憶體管理02-記憶體布局One More Thing