黑馬程式設計師 OC記憶體管理中的MRC

2021-07-04 08:45:08 字數 1924 閱讀 1942

oc記憶體管理的範圍

管理任何繼承

nsobject

的物件,對其他的基本資料型別無效。

oc記憶體管理分類

1)mannulreference counting(mr

c,手動管理

,在開發

ios4.1

之前的版本的專案時我們要自己負責使用引用計數來管理記憶體,比如要手動 retain、release、autorelease 等,而在其後的版本可以使用 arc,讓系統自己管理記憶體。)2)

automatic reference counting

(arc

,自動引用計數

,ios4.1

之後推出的) 

手動記憶體管理應遵守以下原則:

1)只要某個物件還在被使用,那麼這個物件就不會被**;只要想使用這個物件,那麼就應該讓這個物件的引用計數器

+1;當不想使用這個物件時,應該讓物件的引用計數器

-1; 2)

如果你通過

alloc,new,copy

來建立了乙個物件,那麼你就必須呼叫

release

或者autorelease

方法3)

只要你呼叫了

retain

,無論這個物件時如何生成的,你都要呼叫

release 

記憶體管理判斷物件被**的關鍵是重寫dealloc的方法:

- (void) dealloc

1)在這裡一定不要直接通過物件呼叫

dealloc

方法(實際上呼叫並不會出錯)一旦物件被**了

, 它占用的記憶體就不再可用

, 堅持使用會導致程式崩潰(野指標錯誤)為了防止呼叫出錯,可以將「野指標」指向

nil(

0)。 

person.h

#import

@inte***ce

person :

nsobject

@property int

age;

@end

person.m

#import

"person.h"

@implementation

person

//物件是否被**的方法

-(void

)dealloc

@end

main.m 

int main(int argc, const char * argv)

return 0;

}執行結果為:

2015-08-05 19:05:41.126 per[2443:234932] p.retaincount = 1

2015-08-05 19:05:41.127 per[2443:234932] p.retaincount = 2

2015-08-05 19:05:41.128 per[2443:234932] p.retaincount = 1

2015-08-05 19:05:41.128 per[2443:234932]物件被銷毀了~

所以在進行手動記憶體管理時,一定要嚴格遵守記憶體管理原則,否則容易出現野指標和記憶體洩漏

野指標情況:

int main(int argc, const char * argv)

return 0;

}記憶體洩漏情況:

int main(int argc, const char * argv)

return 0;

}由於上面的引用計數不等於0,程式就結束了,p物件不會釋放,這是就造成了記憶體洩漏,使用手動記憶體管理要特別小心。一般使用

自動記憶體管理。

黑馬程式設計師 OC 記憶體管理

1.什麼是記憶體管理 管理範圍 任何繼承了nsobject的物件,對其他基本型別無效 2.物件的基本結構 每個oc物件都有自己的引用計數器,是乙個整數,表示 物件被引用的次數 即有多少個人正在使用oc物件 每個oc物件內部專門有4個位元組的儲存空間來儲存引用計數器 3.引用計數器的作用 當使用all...

黑馬程式設計師 OC基礎 記憶體管理

oc的區域性變數在 塊結束時被系統銷毀,記憶體被 oc的物件,內部有引用計數器,當引用計數器的值為0時,被系統銷毀,記憶體被 區域性變數存放在棧中.物件存放在堆中.注意,物件指標還是存放在棧中,物件本身占用的記憶體存放在堆中.在oc中,我們要對自己寫的繼承了nsobject的物件進行記憶體管理.物件...

黑馬程式設計師 OC語言 5 記憶體管理

若排版有錯誤,請檢視pdf版 2 管理範圍 任何繼承了 nsobject 的物件,對其他基本資料型別 int char float double struct enum等 無效 1 每個oc物件都有自己的引用計數器,是乙個整數,表示 物件被引用的次數 即有多少人正在使用這個oc物件。2 每個oc物件...