天天看點

OC學習----記憶體管理記憶體管理

記憶體管理

程式是在記憶體中進行運作的,那麼它将會占用記憶體空間,而且随着程式的運作,記憶體占用會不斷增加.如果沒有一套完善記憶體管理機制,記憶體會随着程式的運作而會被耗盡,會導緻程式崩潰.

1.C語言:在C語言中,如果程式員用

malloc

calloc

函數開辟了記憶體空間,那麼程式員需要在适當的時候調用

free

函數進行釋放,這種規則是完全靠程式員的實力.

2.Java語言/C#語言:它們有垃圾回收機制,程式員隻用管開辟記憶體空間,而不用管釋放記憶體空間.

3.Object-C語言/C++語言:他們也是需要程式員手動管理記憶體的,也是靠程式員實力.

對于

Object-C

來說,雖然它需要程式員手動管理記憶體,但是它引入了一個機制友善程式員管理,這種機制叫做

引用技數

.

随着發展,蘋果公司為了減輕開發人員的負擔,又引入了另外一種機制,即類似于垃圾回收機制,意味着使用這種機制,開發人員

基本上

不需要關心記憶體的釋放.

對于OC中以上兩種記憶體管理方法,我們分别叫做

手動管理記憶體

自動管理記憶體

,英文簡稱分别為:

MRC

ARC

.

我們XCode在5.0版本以後,我們開發的程式預設都是

自動管理記憶體

,這種方式也是蘋果公司推薦方式.

手動管理記憶體 MRC

對象的生命周期

當一個執行個體對象由類執行個體化出來後,,就代表這個對象的産生;當不用此執行個體對象時,我們需要将此對象銷毀.對象的産生到銷毀,就代表對象的生命周期.

引用計數

在手動管理記憶體的時候,OC語言為開發者提供了一種友善管理記憶體機制,即引用計數,此機制為每一個對象配置設定一個

引用計數器

.

當一個對象産生時,

引用計數器

為此對象的

引用計數

指派為

1

.

當一個對象銷毀時,

引用計數器

為此對象的

引用計數

指派為

.(了解為

,實際上是

1

)

當程式員在手動管理對象的記憶體時,一些方法會引起

引用計數

的改變.

在OC中,用

retainCount

屬性來表示一個對象的引用技術.

改變引用技術的方法

1.對象初始化時,對象的引用技術為

1

,即

alloc

,

new

方法可以改變引用技術,即将對象的引用技數為

1

.

2.使用

retain

方法可以将對象的目前引用計數加1;

3.使用

release

方法可以将對象的目前引用計數減1;

4.使用

retain

方法構造出的對象和原對象是相同的對象;

5.使用

copy

方法構造出的對象是原有對象的副本,使副本對象的引用質數變為1.原有對象保持引用計數不變.

note

:對不可變對象的

copy

除外.

利用引用計數來做記憶體管理

對類的記憶體管理

1.誰建立,誰釋放,

alloc

,

new

的和與

release

的個數相等.

2.将一個對象

retain

,産生出一個新的對象,此新對象也可以釋放原有對象.

3.将一個對象指派給另一個對象,此新對象沒有拿到對象的所有權,不能夠釋放掉所有對象.

對類裡的屬性的記憶體管理

在一個類中,我們用

dealloc

方法對類的屬性進行記憶體管理.

對于

dealloc

方法,此方法是在料銷毀時,自動被調用,而不是被開發者調用 .

dealloc

方法中,我們用

_

+

屬性名

來調用

release

方法來釋放屬性.

類的對象放到集合當中引用計數的改變

1.将一個對象放到集合中,其引用計數加1;

2.當集合對象被銷毀掉,其内元素也被釋放掉;

3.将一個對象放到集合當中,其對象的釋放權就交給了目前集合對象,其記憶體管理就由目前集合對象來操作.

特别

NSString *string = @"ssss";
    [string retain];
    NSLog("string = %ld",string.retainCount);
           
@autoreleasepool和autorelease的使用

1.什麼時候使用

autorelease

:

當一個對象産生時,而無法判斷其什麼時候不使用,此時就可以對此對象發送

autorelease

消息.

2.當向一個對象發達了

autorelease

消息時,該對象就會在其最近的一個自動釋放池

autorelease

釋放.

3.不要随便一個對象就用

autorelease

釋放

繼續閱讀