OC的內存分配

 

 

 

 

 

1.程序佔用內存分類

  •  棧區由編譯器自動分配釋放 ,存放函數的參數值,局部變量的值,基本數據類型等。程序員

  •  堆區:通常由程序員分配釋放, 若程序員不釋放,程序結束時可能由OS回收 ,OC中用alloc函數生成的對象都是放在堆區。架構

  • 全局區(靜態區)(static):全局變量和靜態變量的存儲是放在一塊的,初始化的全局變量和靜態變量在一塊區域, 未初始化的全局變量和未初始化的靜態變量在相鄰的另外一塊區域, 程序結束後有系統釋放。函數

  • 文字常量區 :常量字符串就是放在這裏的。 程序結束後由系統釋放。spa

  • 程序代碼區:存放函數體的二進制代碼.net

     

2.OC數據類型

     Objective-C數據類型能夠分爲:基本數據類型、對象數據類型和id類型。指針

  • 對象類型就是類或協議所聲明的指針類型,例如:code

        NSAutoreleasePool *pool ,其中,NSAutoreleasePool是一個類,NSAutoreleasePool *是它指針類型或叫對象類型。對象

  • 基本數據類型有:int、float、double和char類型。進程

  • id類型能夠表示任何類型,通常只是表示對象類型,不表示基本數據類型,因此剛纔的變量能夠聲明pool也能夠聲明爲id pool。內存

     

3.例子程序(下面的例子是C++的,可是跟oc類似)

這是一個前輩寫的,很是詳細 

//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放在常量區。 

}

4.堆和棧的區別(棧是吃了吐 堆是吃了拉)

  • 按照管理方式分:

    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)一般是指用來存放程序執行代碼的一塊內存區域。
這部分區域的大小在程序運行前就已經肯定,而且內存區域一般屬於只讀, 某些架構也容許代碼段爲可寫,即容許修改程序。 在代碼段中,也有可能包含一些只讀的常數變量,例如字符串常量等。代碼段是存放了程序代碼的數據, 假如機器中有數個進程運行相同的一個程序,那麼它們就能夠使用同一個代碼段。

相關文章
相關標籤/搜索