OC物件記憶體管理

2021-06-22 22:43:30 字數 1593 閱讀 4165

objective c物件記憶體管理

1,管理範圍

> :任何繼承了nsobject的物件,基本資料型別(int,char,float,double,struct,enum等)是不需要管理記憶體的。

2,引用計數器

> 每個oc物件都有自己的引用計數器,是乙個整數,表示「物件被引用的次數」,既有多少人正在使用這個oc物件

> 每個oc物件內部專門有4個位元組的儲存空間來儲存引用計數器

> 當使用alloc,new或者copy建立乙個新物件時,新物件的引用計數器預設就是1

> 當乙個物件引用計數器值為0時,物件占用的記憶體就會被系統**,換句話說,如果物件的計數器不為0,那麼在整個程式執行過程,它占用的記憶體就不可能被**,除非整個程式已經退出。

> 可以給物件傳送retaincount訊息獲得當前的引用計數器值

> 給物件傳送一條retain訊息,可以使引用計數器+1(retain方法返回物件本身)

> 當乙個物件的引用計數器值為0時,那麼它將被銷毀,其占用的記憶體被系統**

> 給物件傳送一條release訊息,可以是引用計數器-1

3,dealloc方法

> 當乙個物件被銷毀時,系統會自動向物件傳送一條dealloc訊息

> 一般會重寫dealloc方法,在這裡釋放相關資源 ,dealloc就像物件的遺言

> 一旦重寫了dealloc方法,就必須呼叫[super dealloc],並且放在最後面呼叫

4,retain和release

一句話總結:誰retain,誰release

單物件管理

管理乙個物件的記憶體,只需要return幾次,就release幾次就好了

多物件管理

難點主要在與多個之間有聯絡的物件的記憶體管理(物件組合)

遵循原則:當你想用乙個物件的時候,你就給這個物件的引用計數器+1,當你不想用這個物件的時候,你必須給這個物件的引用計數器-1.

(1) ,類a包含類b,即某個物件b是物件a的成員變數,a為類a的乙個物件,_b為a物件的乙個成員變數,b為類b的乙個物件。

當類b的乙個物件b被建立好後,類a的物件a想拿來用,則呼叫set方法將物件b傳給類a成員變數_b,此時物件a的set方法有責任對物件_b計數器+1,即在set方法裡面對物件b進行一次retain操作

物件a對_b的計數器-1的情況有兩鐘,一種是物件a本身被銷毀,第二種是物件a想換乙個物件賦給_b。

第一種情況:物件a本身被銷毀

> 則銷毀物件a的dealloc方法有責任在銷毀物件a的同時對物件_b計數器-1,即在dealloc方法裡面進行一次release操作.

第二種情況:物件a想換乙個物件賦給_b

> 則在物件a的set方法有責任對舊物件的計數器-1,即在set方法裡面條件判斷出來傳進來的物件是否是舊物件,若是則不做任何操作,若不是則對舊物件進行一次release操作,並對新物件進行retain操作。

(2) ,set方法和dealloc方法**示例

person類包含car類

// set方法

- (void)setcar:(car *)car

}// dealloc方法

-(void)dealloc

OC物件記憶體管理

nsobject a nsobject alloc init 這時候在堆中分配一塊記憶體,並在棧中建立變數a指標,並將在堆中分配的記憶體起始位址賦值給這個指標a 這樣棧中的指標a就指向了堆中的物件。通過a可以訪問堆中物件。ios物件在arc下是編譯器做記憶體管理,在適當的地方插入relase 當自動...

OC記憶體管理 zombie物件

當我們對於記憶體進行手動管理的時候,會出現兩種錯誤 一種是野指標錯誤,一種則為記憶體洩露.這兩點也是我們去管理記憶體時最終要解決的問題.記憶體洩漏是指 不在使用的物件,一直保留在記憶體中未被銷毀,一直占有著記憶體,耗費記憶體資源直至程式結束.野指標則是指 當乙個指標指向乙個物件時,此物件已經被系統 ...

Oc 記憶體管理

1 對你自己擁有的物件負責,你只能釋放你擁有的物件 2 凡是你通過 retain alloc copy等手段獲得了所有者的物件,都必須在你不使用的時候來呼叫release autorelease等手段來釋放對他的所有權 3 在一定的 段內,對同乙個物件所作的copy alloc retain的操作次...