1. 程式人生 > >iOS內存管理小談

iOS內存管理小談

object 指針 執行 依然 內存 就是 基本數據類型 分別是 但是

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

iOS內存管理小談