autorelease 的基本使用

2022-08-11 10:36:10 字數 3509 閱讀 5995

5-autorelease 

的基本使用

0,引入

person *p = [persom new];[p release];

[p run];

[p run];

// 希望不立即釋放,待 

run執行完後再釋放

1,自動釋放池簡介及

autorelease

簡介自動釋放池1)在

ios 

執行過程中

,會建立無數個池子

,這些池子都是以棧的結構存在

2)當乙個物件呼叫

autorelease 時,

會將這個物件放到位於棧頂部的池中

自動釋放池的建立

1. 在

ios 5.0 

以前nsautoreleaserool *pool = [[nsautoreleaserool alloc] init];//

**預設入池

[pool release];

2. 在

ios 5.0 

以後@autoreleasepool

autorelease

是一種支援引用計數的記憶體管理方式

,本質就是乙個函式允許暫時儲存某個物件

,然後在記憶體池自己排乾之後

,給每乙個傳送 

release

訊息注意:傳送

release

訊息不代表會釋放

,看引用計數

2,為什麼使用

autorelease

oc 的記憶體管理機制中比較重要的一條規律是

:誰申請

,誰釋放

考慮這種情況

,如果乙個方法需要返回乙個新建的物件

,該物件何時釋放

?方法內部是不會寫 

release

來釋放物件的

,因為這樣做會將物件立即釋放而返回乙個空物件;呼叫

者也不會主動釋放該物件的

,因為呼叫者遵循「誰申請

,誰釋放」的原則。那麼這個時候,就發

生了記憶體洩露。

不使用 

autorelease

存在的問題

針對這種情況

,objective-c 

的設計了 

autorelease,

既能確保物件能正確釋放

,又能返回有效的

物件。使用 autorelease

的好處(1)

不需要再關心物件釋放的時間(2

)不需要再關心什麼時候呼叫

release

3, autorelease

原理autorelease 

實際上只是把對

release 

的呼叫延遲了

,對於每乙個

autorelease,

系統只是把該

object 

放入了當

前的autorelease pool 中,

當該pool

被釋放時,該

pool 

中的所有

object 

會被呼叫

release

。4, autorelease

何時釋放

對於 autorelease pool本身,

會在如下兩個條件發生時候被釋放

(詳細資訊請參

見第 5條)

1)手動釋放 

autorelease pool2)runloop

結束後自動釋放

對於 autorelease pool

內部的物件

在引用計數的 

retain == 0 

的時候釋放。

release

和 autorelease

pool

的drain

都會觸發 

retain--

事件。5, autorelease

的原理要搞懂具體原理

,則要先要搞清楚

autorelease 

何時會建立。

我們的程式在

main()

呼叫的時候會自動呼叫乙個

autorelease,

然後在每乙個

runloop,

系統會隱

式建立乙個

autorelease pool,

這樣所有的

release pool 

會構成乙個象

callstack

一樣的乙個棧式

結構,在每乙個

runloop 

結束時,

當前棧頂的

autorelease

pool(main()

裡的 autorelease)

會被 銷毀

,這樣這個

pool 

裡的每個

object

會被 release

。可以把 

autorelease pool

理解成乙個類似父類與子類的關係

,main()

建立了父類,每個

runloop 

自 動生成的或者開發者自定義的

autorelease pool

都會成為該父類的子類。當父類被釋放的時候

,沒有被釋放的子類也會被釋放

,這樣所有子類中的物件也會收到

release 

訊息。 那什麼是乙個

runloop 呢?

乙個 ui

事件,timer

call, delegate call,

乙個滑鼠事件

,鍵盤按 下

(mac osx),

或者iphone

上的觸控事件,非同步

連線下後當接收完資料時

,都會是乙個新的

runloop

。 一般來說

,訊息迴圈執行一次是毫秒級甚至微秒級的,因此

autorelease

的效率仍然是非常高的

,確實是乙個巧妙的設計。

6-autorelease 

注意即錯誤的使用

1,使用注意

:不是說放到池中的**都會釋放

,需要呼叫 

autorelease

方法在釋放池外部使用 

autorelease

無效需要注意 自動釋放池的巢狀問題自動釋放池

,不便儲存占用記憶體較大的物件

2, autorelease

的錯誤用用法

連續多次使用

autorelease

使用自動釋放池以後,又 

release

7-autorelease 

的應用場景

1, autorelease

的應用場景

建立物件的同時

,加入釋放池

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

2,完善快速建立物件的方法 

十二 oc中autorelease的基本使用

windows phone 7手機開發 ios培訓 期待與您交流!在前面的記憶體管理部落格中,提到過release方法,它是乙個物件方法,返回的是空值。autorelease方法也有著release方法有著大體相同的作用。注意 autoreleasepool這是oc中的乙個關鍵字,而autorele...

autorelease基本使用

autorelease是一種支援引用計數的記憶體管理方式,只要給物件傳送一條autorelease訊息,會將物件放到乙個自動釋放池中,當自動釋放池被銷毀時,會對池子裡面的所有物件做一次release操作 注意,這裡只是傳送release訊息,如果當時的引用計數 reference counted 依...

iOS MBProgressHUD的基本使用

方式1.直接在view上show hud mbprogresshud showhudaddedto self.view animated yes retain hud.delegate self 常用的設定 小矩形的背景色 hud.color uicolor clearcolor 這兒表示無背景 顯...