iOS中的堆和棧

對於iOS這種移動端的開發,程序員應該合理地管理內存,這樣才能讓應用更加靈活流暢地運行。在Andriod中,是由垃圾回收機制來處理在堆中的內存空間,而在iOS中,需要程序員手動操作在堆中間的內存空間,並進行內存的分配和釋放(ARC之後換做應用幫助程序員進行大部分操作)

我們先來看看iOS中一共有哪些存儲空間:
1、棧區(stack)
2、堆區(heap)
3、靜態區
4、寄存器區
5、文字常量區
6、程序代碼區
在這裏一共有6種不同的區域,但我們做iOS開發最需要關心的是前二個,本文也是對前兩個做詳細介紹:(由於本文主要對理論上進行說明,所以文章的格式爲列舉知識點並進行分析的形式)

一、棧區:
棧區中的內存空間是由編譯器自動釋放的,一般來是存放參數,局部變量等等。需要我們關心的是下面幾點:
1、由於棧中的內存空間都是以壓棧和出棧的方式進行的,所以先聲明的變量就會先壓入棧,而棧的結構是這樣的,最下面的棧的是最大的,也就是說,先聲明(先壓入棧)的內存地址比後聲明(後壓入棧)的內存地址要大。
2、在一個函數中,我們經常會聲明一些函數的參數,在棧中,如果有函數的聲明的話,那麼會在棧中分配一個內存空間給這個函數,然後這塊內存空間是獨立於其他分配的內存空間的,也就是說:如果使用函數去將一個聲明的變量作爲參數,那麼這個變量的內存空間是在函數內存空間外部的。函數本來有個形式參數,這個參數是在函數內存空間之內的。所以這兩個變量的內存地址是不同的。
3、在iOS開發中,棧空間的大小爲1M。

二、堆區:
我們知道棧空間只有1M,那麼我們很多時候需要的資源都會超過1M,所以由此也引出了堆。在iOS中,棧空間是每個程序都有一個的,而且互相不干擾,堆空間則是一個系統公共的,換句話說就是所有的應用程序都使用一個堆空間。下面將要詳細說明堆空間的幾個特點:
1、所有堆中的內存空間分配都是由操作系統所控制的,如果一個應用程序需要一塊內存空間,那麼這時候操作系統收到通知後(例如我們實例化一個對象時候使用的alloc操作),就會在堆空間中去尋找,看哪一塊區域比較合適(包括使用過的和沒有使用過的),找到後就將這個內存空間的地址返回。alloc操作是告訴系統分配一塊內存空間,然後這塊內存空間可能是已經使用過的。所以接着,我們一般會使用init操作,這個操作就是初始化這一塊內存空間。
2、對於堆中的內存空間的操作,是通過鏈表來操作的,這和C語言是一樣的(Objective-C是基於C語言的)
3、通過上面的描述,我們已經知道,分配內存空間是由操作系統完成的,但是,關於內存空間的釋放卻是交給了程序員來完成。這也讓地iOS系統的內存管理比andriod的內存管理機制要好。andriod中是由垃圾回收機制來操作的,程序中開出一條線程來專門複製垃圾回收,這條線程時不時地進入到堆空間中去看看有沒有需要回收的內存空間。在iOS中,是不存在垃圾回收機制的,也就是說內存的釋放需要程序員進行,如果在代碼寫的不完善,就會造成內存泄露,內存泄露就是說系統分配了空間之後但是沒有進行釋放,那麼這個區域就一直被佔用着,直到系統重新啓動,清空了堆中的內存佔用。
4、堆中的內存空間都是匿名訪問的,也就是說系統如果收到通知,需要多大的空間,那麼系統會分配這麼大的空間,但是系統不會記錄這個空間是給誰了,關於誰指向了這個空間系統是不知道的。


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章