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 這兒表示無背景 顯...