堆和棧
全局(靜態(tài))區(qū)
存放程序靜態(tài)分配的變量和全局變量。
棧區(qū)(stack)?
由編譯器自動分配并釋放
存放函數(shù)的參數(shù)值,局部變量等
當(dāng)一個方法執(zhí)行時,會建立自己的內(nèi)存棧,在這方法內(nèi)定義的變量,局部變量將會逐個放入這塊棧內(nèi)存里,隨著方法的執(zhí)行結(jié)束,這個方法的內(nèi)存棧也將自然銷毀。
棧一般來說都是一個先進后出的隊列,后進入的數(shù)據(jù),會被先釋放掉.棧區(qū)存放函數(shù)內(nèi)的局部變量,形參和函數(shù)返回值.棧區(qū)的內(nèi)存由系統(tǒng)自動管理釋放,內(nèi)存的分配是連續(xù)的,且分配的內(nèi)存地址是向下增長.申明的變量過了作用域范圍后內(nèi)存便會自動釋放,不需要開發(fā)人員手動管理.
堆區(qū)(heap)?
大部分自定義的類都在堆中
比如在ios 中 alloc 都是存放在堆中。
在程序中創(chuàng)建一個對象時,這個對象將被保存到運行時數(shù)據(jù)區(qū)中,以便反復(fù)利用(因為對象的創(chuàng)建成本通常較大),這個運行時數(shù)據(jù)區(qū)就是堆內(nèi)存。
堆內(nèi)存中的對象不會隨方法的結(jié)束而銷毀,即使方法結(jié)束后,這個對象還可能被另一個引用變量所引用(在方法的參數(shù)傳遞時很常見),則這個對象依然不會被銷毀。只有當(dāng)一個對象沒有任何引用變量指向它時,系統(tǒng)的垃圾回收器才會在合適的時候回收它。
iOS中數(shù)據(jù)是存在堆和棧中的,然而我們的內(nèi)存管理管理的堆上的內(nèi)存,棧上的內(nèi)存并不是我們管理
非OC對象(基礎(chǔ)數(shù)據(jù)類型)存儲在棧上
OC對象存儲在堆上