OC記憶體管理

2021-07-01 23:09:31 字數 1936 閱讀 9386

計數器:每當物件被建立的時候,物件就會擁有乙個計數器,計數器預設值是1,當計數器的值為0的時候,物件就會被系統收回。

方法的基本使用:

1.retain :計數器+1,回返回物件本身

2.release :計數器-1,沒有返回值

3.retaincount :返回當前計數器的值

4.dealoc : 當乙個物件被收回的時候就會呼叫,一定要呼叫[super dealloc]方法,這句話在最後面

例如:

#import #import "person.h"

int main()

當計數器為0被**,p物件已被**,接著對p物件使用retain方法就會發生錯誤:

-[person retain]: message sent to deallocated instance 0x100205990,即給以**的物件傳送訊息

#import #import "person.h"

int main()

p物件被**後就是乙個殭屍物件,不可在用

概念:殭屍物件:所占用記憶體已被**的物件,不可在使用

野指標:指向殭屍物件(不可用記憶體)的指標,給野指標傳送訊息就會報錯(exc_bad_access )

空指標:沒有指向任何東西的指標,或儲存的東西是nil、null、0,給空指標傳送訊息不會報錯

多個物件之間記憶體管理

假如,有乙個人,擁有有本書,有人、書兩個物件

person類的.m文 件**

#import "person.h"

@implementation person

- (void)setbook:(book *)book

- (book *)book

// 物件被收回時呼叫

- (void)dealloc

@end

main函式

#import #import "person.h"

int main()

總結;

1.你想使用那個物件,就應該讓哪個物件的計數器+1(即執行retain操作)

2你不想使用那個物件,就應該讓那個物件的計數器-1(即執行release操作)

3.誰retain,誰release

4.誰alloc,誰release

假如乙個人擁有多本書,看完一本又買一本

int main()
結果是12沒有被**,是因為在p物件的set方法的舊的物件和新的物件的區別,當新的引數物件傳進來時,把舊的物件的計數器retain,而p被**呼叫dealloc函式時,呼叫的時當前物件的release,所以在新的引數物件傳進來前給舊的物件執行release,還可以在set方法中進行一些過濾,保證不會出現操作殭屍物件,更改如下;

#import "person.h"

@implementation person

- (void)setbook:(book *)book

}- (book *)book

// 物件被收回時呼叫

- (void)dealloc

@end

這樣避免了操作殭屍物件

總結:

**規範:只要又alloc就必須要有release,物件不是alloc生成的就不需要release

set方法的**規範:

1.基本資料型別:直接複製

2.oc物件:

*先判斷是不是新傳進來的物件

* 對舊物件執行一次release

* 對新物件執行一次retain

dealloc**的規範:

*一定要有[super dealloc],且放在最後面

*對self所擁有的其他物件執行一次release

以上是對oc記憶體管理的學習總結,還不夠完善,有待補充

Oc 記憶體管理

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

OC記憶體管理

1.記憶體管理原則 如果對乙個物件使用了alloc mutable copy retain,那麼你必須使用相應的release或者autorelease。2.管理範圍 任何繼承了nsobject 的物件,對其他基本資料型別 int char float double struct enum等 無效 ...

OC 記憶體管理

管理範圍 任何繼承nsobject的物件,對其他的基本資料型別無效。判斷物件要不要 的唯一依據就是計數器是否為0,若不為0則存在。所以對記憶體的管理就是對計數器的管理 1 retain 計數器 1,會返回物件本身 2 release 計數器 1 沒有返回值 3 retaincount 獲取當前的計數...