IOS開發中的記憶體管理(一)

2021-06-28 21:05:44 字數 1632 閱讀 7932

所能占用的記憶體是有限制的。

所占用的記憶體較多時,系統會發出記憶體警告,這時得**一些不需要再使用的記憶體空間。

管理範圍:任何繼承了

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訊息 陣列物件會放棄該物件的所有...