所能占用的記憶體是有限制的。
所占用的記憶體較多時,系統會發出記憶體警告,這時得**一些不需要再使用的記憶體空間。
管理範圍:任何繼承了
nsobject
的物件,對其他基本資料型別(int
、char
、float
、double
、struct
、enum
等)無效
每個oc
物件都有自己的引用計數器,是乙個整數,表示「
物件被引用的次數」,即有多少人正在使用這個oc物件
每個oc
物件內部專門有
4個位元組的儲存空間來儲存引用計數器
當使用alloc、new或者copy建立乙個新物件時,新物件的引用計數器預設就是1
當乙個物件的引用計數器值為0時,物件占用的記憶體就會被系統**。換句話說,如果物件的計數器不為0
,那麼在整個程式執行過程,它占用的記憶體就不可能被**,除非整個程式已經退出
給物件傳送一條retain訊息,
可以使引用計數器值+1(retain
方法返回物件本身)
給物件傳送一條release訊息,
可以使引用計數器值-1
可以給物件傳送retaincount訊息獲得當前的引用計數器值
當乙個物件的引用計數器值為0時,那麼它將被銷毀,其占用的記憶體被系統**
當乙個物件被銷毀時,系統會自動向物件傳送一條dealloc訊息
一般會重寫dealloc方法,在這裡釋放相關資源,dealloc
就像物件的遺言
一旦重寫了dealloc
方法,就必須呼叫
[super dealloc]
,並且放在最後面呼叫
不要直接呼叫
dealloc方法
一旦物件被**了,它占用的記憶體就不再可用,堅持使用會導致程式崩潰(野指標錯誤)
要想手動呼叫retain
、release
等方法,在建立專案的時候不要勾選
arc只要還有人在用某個物件,那麼這個物件就不會被**
只要你想用這個物件,就讓物件的計數器+1
當你不再使用這個物件時,就讓物件的計數器-1
如果你通過alloc、new或[mutable]copy來建立乙個物件,那麼你必須呼叫release或autorelease
換句話說,不是你建立的,就不用你去[auto]release
ø 只要你呼叫了retain,無論這個物件是如何生成的,你都要呼叫release
有始有終,有加就有減
曾經讓物件的計數器+1
,就必須在最後讓物件計數器
-1給某個物件傳送一條autorelease
訊息時,就會將這個物件加到乙個自動釋放池中
當自動釋放池銷毀時,會給池子裡面的所有物件傳送一條release訊息
呼叫autorelease
方法時並不會改變物件的計數器,並且會返回物件本身
autorelease實際上只是把對release的呼叫延遲了,對於每一次autorelease,系統只是把該物件放入了當前的autorelease pool中,當該pool被釋放時,該pool中的所有物件會被呼叫release
一般來說,
除了alloc、copy之外的方法建立的物件都被宣告了autorelease
IOS開發中的記憶體管理(二)
arc是自ios 5之後增加的新特性,完全消除了手動管理記憶體的煩瑣,編譯器會自動在適當的地方插入適當的retain release autorelease語句。大大的簡化了開發的複雜度並且也提高了開發效率 arc 的規則 只要還有乙個 強指標變數指向物件 物件就會保持在記憶體中 預設所有例項變數和...
iOS開發 漫談記憶體管理(一)
1 mrc與arc 蘋果提供兩種記憶體管理機制 一種是mrc manual reference count 即手動引用計數 還有一種是arc auto reference count 即自己主動引用計數。手動引用計數,顧名思義。須要程式猿主動呼叫retain release等方法來管理記憶體。而自己...
ios開發記憶體管理要點
一 使用nsmutablearray例項時的三個記憶體管理要點 1.物件加入nsmutablearray例項時,物件會收到retain訊息 陣列物件會成為該物件的擁有方,並得到乙個指向該物件的指標。2.物件從nsmutablearray例項移出時,會收到release訊息 陣列物件會放棄該物件的所有...