標籤:為我 全域變數 建立 執行 程式員 c中 知識 ios 記憶體配置
記憶體管理管理的是哪的記憶體?其實我們要管理的就是堆區的記憶體空間和任何繼承NSObject的對象 1.首先要明確的一點是記憶體總共分為五大區,分別是棧區,堆區,BSS段,資料區和代碼區; 2.BSS段,資料區和代碼區這三大區是隨著程式的啟動載入到記憶體空間的,我們熟知的全域變數就儲存在這裡,不過分為兩種情況:如果是未初始化的全域變數,那麼它儲存在BSS段,如果是初始化的全域變數的話就儲存在資料區;很多時候我們不推薦大家建立全域變數的原因就是因為如果一個程式啟動的話,儲存在這裡的全域變數就會隨著程式的啟動進行載入,分配記憶體空間;這就會導致程式載入的特別緩慢。不過有一點要明確的是這三大區是系統自動管理的,所以我們的記憶體管理不是管理這三大區 3.接下來就剩下了棧區和堆區,首先我們要知道的是在記憶體配置中棧區的地址是從高到低分配,堆區的地址是從低到高分配;而且我們所熟知的基礎資料型別 (Elementary Data Type)儲存在棧區中,它所佔用的儲存空間是一定的 4.其次,在棧區中同時存放的還有局部變數,而局部變數的空間不需要我們進行回收,而是它所在的代碼塊或者函數在結束的時候會自動回收,所以棧區的記憶體空間不需要程式員管理 5.最後只剩下堆區,所以我們可以基本確定我們要學習的記憶體管理就是對堆區記憶體空間的管理,不過我們還要先分析堆區再做決定 6.在OC中我們建立對象時用的語句是new,而new的三個步驟依次為:1.在堆區中分配一塊記憶體空間 2.給建立好的對象進行初始化 3.返回地址;我們看到了它是在堆區中分配!所以我們要做的就是管理堆區的空間,考慮堆區記憶體什麼時候申請,什麼時候回收;同時因為我們建立對象的原因,記憶體管理實際上也要管理任何繼承自NSObject的對象,而對其他基礎資料型別 (Elementary Data Type)無效。所以到這裡我們應該知道我們在OC中要討論的記憶體管理實際上就是研究堆區的記憶體空間以及任何繼承NSObject的對象! 7.分析到這裡時我們一定恍然大悟,其實我們對上面的每個小段落的知識都是瞭解的,只是我們從來沒有條理性地將它們串聯到一起;我們在明確記憶體管理到底要管理什麼東西之後,我們在討論一下記憶體泄露的本質原因 8.記憶體泄露的本質原因就是Object Storage Service在堆區,局部變數和指標等儲存在棧區,在一個程式執行完畢進行銷毀的時候,代碼塊中所涉及的所有局部變數都會被系統回收,而且指向對象的指標也會被系統回收,那麼在這個時候,存在於堆區的對象沒有指標的指向但是卻依然存在於記憶體中,就會造成記憶體泄露
iOS記憶體管理小談