棧區:由編譯器自動分配釋放 ,存放函數的參數值,局部變量的值,基本數據類型等。程序員
堆區:通常由程序員分配釋放, 若程序員不釋放,程序結束時可能由OS回收 ,OC中用alloc函數生成的對象都是放在堆區。架構
全局區(靜態區)(static):全局變量和靜態變量的存儲是放在一塊的,初始化的全局變量和靜態變量在一塊區域, 未初始化的全局變量和未初始化的靜態變量在相鄰的另外一塊區域, 程序結束後有系統釋放。函數
文字常量區 :常量字符串就是放在這裏的。 程序結束後由系統釋放。spa
程序代碼區:存放函數體的二進制代碼.net
Objective-C數據類型能夠分爲:基本數據類型、對象數據類型和id類型。指針
對象類型就是類或協議所聲明的指針類型,例如:code
NSAutoreleasePool *pool ,其中,NSAutoreleasePool是一個類,NSAutoreleasePool *是它指針類型或叫對象類型。對象
基本數據類型有:int、float、double和char類型。進程
id類型能夠表示任何類型,通常只是表示對象類型,不表示基本數據類型,因此剛纔的變量能夠聲明pool也能夠聲明爲id pool。內存
這是一個前輩寫的,很是詳細 //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放在常量區。 }
按照管理方式分:
1)對於棧來說,是由系統編譯器自動管理,不須要程序員手動管理
2)對於堆來說,釋放工做由程序員手動管理,不及時回收容易產生內存泄露
按照分配方式分:
1)堆是動態分配和回收內存的,沒有靜態分配的堆
2)棧有兩種分配方式:
靜態分配:靜態分配是系統編譯器完成的,好比局部變量的分配
動態分配:動態分配是有alloc函數進行分配的,可是棧的動態分配和堆是不一樣的,它的動態分配也由系統編譯進行釋放,不須要程序員手動管理(student *stu = [[student alloc] init],stu就是系統動態分配在棧中的指針變量)
內存分爲4段,棧區,堆區,代碼區,全局變量區
BSS段:BSS段(bss segment)一般是指用來存放程序中未初始化的全局變量的一塊內存區域。
BSS是英文Block Started by Symbol的簡稱。BSS段屬於靜態內存分配。
數據段:數據段(data segment)一般是指用來存放程序中已初始化的全局變量的一塊內存區域。數據段屬於靜態內存分配。
代碼段:代碼段(code segment/text segment)一般是指用來存放程序執行代碼的一塊內存區域。
這部分區域的大小在程序運行前就已經肯定,而且內存區域一般屬於只讀, 某些架構也容許代碼段爲可寫,即容許修改程序。 在代碼段中,也有可能包含一些只讀的常數變量,例如字符串常量等。代碼段是存放了程序代碼的數據, 假如機器中有數個進程運行相同的一個程序,那麼它們就能夠使用同一個代碼段。