內存管理
- 內存中的五大區域
1.棧區
存儲局部變量的區域
出了作用域之后就會被系統立即回收
2.堆區
存儲的是OC對象 程序員手動申請的連續字節空間 需要調用free函數來釋放
3.BSS段
未初始化的全局變量 靜態變量
(一旦初始化就會從BSS段中回收掉,轉存到數據段中)
4.數據段
初始化后的全局變量 靜態變量 常量數據
(直到程序結束后才會被回收)
5.代碼塊
- 內存管理的范圍
1.只需要管理堆區中的oc對象的釋放
2.除了堆區中的oc對象,其他區域中的數據都是系統自動釋放的
3.如果程序員不主動釋放它的話,將會一直到程序結束的時候才會被釋放
這樣就會大量占用內存空間會導致系統崩潰
4.當oc對象無人使用的時候,我們就要釋放這個oc對象節省內存
- 引用計數器(retainCount)
每一個oc對象都有一個引用計數器屬性 它的類型是unsigned long類型(占據8個字節)
作用:用來記錄這個對象有多少個人在使用它
1.當我們新創建1個對象出來的時候,這個對象的引用計數器的默認值是1
2.當這個對象多1個人使用的時候,就應該先讓這個對象的引用計數器+1
3.當這個對象少1個人使用的時候,就應該先讓這個對象的引用計數器-1
4.當這個對象的引用計數器的值為0的時候,系統就會立即自動的回收這個對象
在回收這個對象的同時,會自動的調用這個對象的dealloc方法.
==(少一個人使用就代表當前現在這個對象不再使用了就先讓它-1 多一個人使用就是多了一個新的對象 先給它+1 創建的時候默認為1 當我用到那個對象的時候要先給當前對象加1之前的那個對象要-1)==
==即:release舊值 retain新值==
- 如何操作引用計數器
1. 為對象發送1條retain消息. 那么這個對象的引用計數器的值就會+1
2. 為對象發送1條release消息. 這個對象的引用計數器的值就會-1
3. 為對象發送1條retainCount消息.就可以得到這個對象的引用計數器的值.
內存管理的分類
- MRC(Manual Reference Counting)手動引用計數
當對象多1個人使用的時候.程序員要寫1句代碼來讓這個對象的引用計數器+1
當對象少1個人使用的時候.程序員要寫1句代碼來讓這個對象的引用計數器-1
需要程序員手動的寫代碼來改變對象的引用計數器的值.
- ARC(Automatic Reference Counting)自動引用計數
系統自動的幫助我們去計算對象的引用計數器的值
ARC是新的LLVM3.0編譯器的一項特性,解決了手動管理內存的麻煩.
可以說是WWDC2011和iOS5引入的最大的變革和最激動人心的變化
當ARC開啟時, 編譯器會自動的在合適的地方插入retain、release、autorelease代碼.
編譯器自動為對象做引用計數
==Xcode6開始默認使用ARC==