oc記憶體管理

2021-07-05 06:39:25 字數 1967 閱讀 1329

一.oc記憶體管理機制

1.記憶體管理

oc記憶體管理的範圍是所有繼承自nsobbject的物件。對基本資料型別是無效的。(基本資料型別的物件由系統自動**)

oc記憶體管理是是使用引用計數法則,當乙個物件被建立時便會有retaincount(引用計數器)這個屬性。

2.引用計數器

每個oc物件都有乙個8位的引用計數器,當使用alloc,new或者copy的來建立乙個新物件的時候,新物件的引用計數預設被設定為1

當乙個物件的引用計數為0時,這個物件便會被系統**

物件的引用計數不為0時,在程式執行中,它所占用的記憶體時不會被**的,直到程式執行結束。

3.引用計數的操作

給物件傳送retain訊息時,引用計數加1

給物件傳送release訊息時,引用計數減1

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

4.物件銷毀

當乙個物件的引用計數為 0時,它所占用的記憶體便會被系統**。物件銷毀一般呼叫的是dealloc方法。

野指標這裡需要注意的是避免野指標的出現,當物件被**那麼他對應的記憶體便不能再使用,強行使用的話會導致程式崩潰。

而野指標指的就是那些指向殭屍物件(不可用記憶體)的指標。

為了避免野指標的出現一般在物件被**之後,將指設定為空指標。

如:

person *p = [[person alloc] init];

[p release];

//當例項物件被釋放後,不能給它傳送任何一條訊息。

p = nil;

二.記憶體管理方式

1.記憶體管理的原則

記憶體管理的**法則,如果乙個對乙個物件使用了alloc,copy,retain,那麼必須使用的相應的relese或者autorelease進行釋放。(即誰建立誰釋放)

2.set方法管理記憶體

如果乙個類中有乙個oc物件的成員變數,則這個類必須負責這個成員變數相關的記憶體。

例如乙個人擁有一輛車,那麼在人的物件被銷毀之前必須先將車的引用計數器減一。

- (void)setcar:(car *)car 

}- (void)dealloc

3.@property引數

@property可以自動生成setter方法和getter方法的宣告和實現,除此之外@property還可以加入一些引數來對自動生成的setter方法和getter進行限定。

比如: @property(retain,readonly) int a;

三.迴圈引用

迴圈引用指的是兩個物件相互retain,導致兩個永遠無法釋放。

b.h中

@property (nonatomic,retain) a;

a.h中

@property (nonatomic,retain) b;

這樣就會造成迴圈引用。

解決方案,一端用assign,另一端用retain

四.autorelease方法

給物件傳送一條autorelease訊息之後,物件被放入到乙個自動釋放池中

當自動釋放池銷毀時,會給釋放池中呼叫過autorelease的物件傳送一條release訊息

autorelease只是延遲了對release的呼叫,並不會改變物件本身的計數器。

自動釋放池的建立

@autoreleasepool

五.arc

arc是自動管理記憶體的,在arc中有強指標和弱指標分別用(_strong和_weak修飾),當沒有強指標指向物件時,就會釋放改物件。

迴圈引用,在arc中也存在迴圈引用,

如:在b.h中

@property (nonatomic,strong) a;

在a.h中

@property (nonatomic,strong) b;

解決方式是乙個用weak修飾,乙個用strong修飾

乙個專案中可以相容mrc和arc。

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 獲取當前的計數...