Objective-C程序內存分布:程序在運行中會占用內存,一般內存中分為堆區,棧區,代碼區等那麼Objective-C的內存分布又是什麼樣的呢?
我們查看內存分布是我們可以通過打印內存地址比如說堆和棧,他們的內存地址相距就非常非常遠,我們通過下面的圖片來了解內存程序運行時內存的分布情況。
全局區:存放全局變量和常量
非初始化(bss):存放沒有被初始化或初始化為0的全局變量;
初始化(data): 初始化過的全局變量數據,用來保存初始化了的非0的全局變量 ;
文字常量區(rodata):存放常量數據;
程序代碼區(text):用來存放程序的代碼(如函數)和部分整數常量是可以執行的不被共享;
棧區(stack):由系統自動分配,一般存放函數參數值、局部變量的值等。由編譯器自動創建與釋放;
堆區(heap):由程序創建和釋放,相對自由一片區域,沒有大小限制,采用鏈表形式管理;
查看下方代碼查看分布情況
//代碼為前輩所有 //main.cpp int a = 0; // 全局初始化區 char *p1; // 全局未初始化區 main { int b; // 棧 char s[] = "abc"; // 棧 char *p2; // 棧 char *p3 = "123456"; // 123456\0在常量區,p3在棧上 static int c =0; // 全局靜態初始化區 p1 = (char *)malloc(10); p2 = (char *)malloc(20); // 分配得來的10和20字節的區域就在堆區 strcpy(p1, "123456"); // 123456\0在常量區,這個函數的作用是將"123456" 這串字符串復制一份放在p1申請的10個字節的堆區域中。 // p3指向的"123456"與這裡的"123456"可能會被編譯器優化成一個地址。 }
上一篇中提到Block對應不同類型的Block,當然也存儲在不同區域。堆中的內存需要我們手打創建和釋放,相比較其他都是系統創建很釋放。