autorelease自動釋放池

2021-07-09 02:09:46 字數 2180 閱讀 1123

什麼是自動釋放?字面意思就是一種事物用完之後就會自動脫落,用比喻就好比發射衛星的火箭,燃料用完了由於需要減輕重量,所以就得脫離主體.那麼在oc中自動釋放是什麼意思呢?就是記憶體當中存有的資料,經過某些步驟到最後就釋放了,也就是說不存在了.

二.自動釋放池

既然說起了自動釋放了,那麼就不能忽略自動釋放池了.怎麼表示呢?

@autoreleasepool
這就是**的表現形式.接著我們來說說它的作用吧.

//在@autoreleasepool結束時或者被手動釋放時,會對池中所有"加入了該池"的物件進行一次release操作,可以不再關心relea  se的呼叫時間,也不需要再關心物件釋放的時間.
前面我們已經說過了,release在記憶體中的作用了三句話:

//1)誰引用,誰retain;

//2)誰引用,誰release;

//3)誰retain,誰release;

三.autorelease與release的區別

那麼怎麼區分兩者呢?我們來看看區別吧!

release是立即執行物件的retaincount -

1操作,而autorelease是讓物件加入自動釋放池,並不立即執行計數器-

1操作,在自動釋放池結束時再執行release操作,相當於release操作的延遲.

我們來看看**:

-(void)dealloc

上面重寫了父類的構造方法.看下面的訪問.

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

[per release];

得出來的結果是:
[1383:1829431] person 銷毀了....記憶體釋放
這是為什麼呢?因為在release的時候直接,也就是釋放的時候,呼叫了重寫的方法.所以就列印出來了結果.也就是說德dealloc什麼時候才會執行呢,也就是在realease釋放的時候直接呼叫了.

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

// [per release];

當你注釋掉了

[per release]

的時候是列印部出結果的.下面我們同過自動釋放池來釋放.

//        [per release];

[per autorelease];

[1401:1880907] person 銷毀了....記憶體釋放
看上面的結果完全的可以說明有些時候

autorelease

和 release

是可以相等的,但是又不完全相等.[per autorelease]設定在釋放池自動銷毀,並不是馬上銷毀.

四.autorelease作用的範圍

那麼autorelease運用有多大的範圍呢?我們來看看下面的程式吧!

@autoreleasepool (1)

// [per autorelease];

nslog(@"%p",per);//這段**是無法執行的.

由上面的程式,我們就可以看出來,當**出了途中的(1)處的時候是無法列印出結果的,也就是說會報錯.所以也就是說

[per autorelease]

這段**的作用域的hi在離它最近的花括號.

五.autorelease的使用注意

//1.只有在池內呼叫autorelease方法才加入自動釋放池: [obj autorelease]

//2.每呼叫一次autorelease操作,自動釋放池結束時會執行一次release操作,所以不要多次呼叫

//3.自動釋放池是釋放的延遲,不要在池內建立過多的物件,也不要對占用記憶體大的物件使用autorelease

//4.自動釋放池巢狀:棧頂層池中的物件最先釋放

上面寫的一定是使用的重點,使用的時候要特別的注意,否則就會出錯.

六.autorelease的不足

控制不靈活,只能等到釋放池銷毀才會release.不能很好的控制什麼時候銷毀,銷毀的時候能呼叫dealloc,所以說不是很推薦用.最後我想說這是我分享給大家的我的心得,也是我的總結,希望對你們有用吧.

autorelease 什麼時候釋放

在iphone專案中,大家會看到乙個預設的autorelease pool,程式開始時建立,程式退出時銷毀,按照對autorelease的理解,豈不是所有autorelease pool裡的物件在程式退出時才release,這樣跟記憶體洩露有什麼區別?答案是,對於每乙個runloop,系統會隱式建立...

autorelease 什麼時候釋放

在iphone專案中,大家會看到乙個預設的autorelease pool,程式開始時建立,程式退出時銷毀,按照對autorelease的理解,豈不是所有autorelease pool裡的物件在程式退出時才release,這樣跟記憶體洩露有什麼區別?答案是,對於每乙個runloop,系統會隱式建立...

自動釋放池

自動釋放池是什麼時候建立的?又是什麼時候銷毀的?原題 思考 1,有返回值的類方法建立出來的物件都是autorelease的。autorelease物件出了作用域後,就會被新增到自動釋放池中。如果largenumber非常大,有可能在乙個for中就把自動釋放池填滿,記憶體消耗非常大!2,解決方案 在f...