關於NSAutoReleasePool的理解

2021-08-25 23:18:21 字數 1448 閱讀 1526

做iphone應用開發已經2年多了, 但一些基礎的概念性問題只是大致了解, 腦袋中有個模糊的概念. 雖然對平時工作開發沒什麼影響, 不過時間長了, 心裡總是有點虛. 所以從現在開始, 每當我遇到乙個模糊概念的問題或topic, 我都要寫一篇blog來記錄分析, 響應之前在網上看過的乙個blog簽名:好記性不如爛部落格.

今天需要記錄的是關於nsautoreleasepool的理解.(大部分內容來自於ios4.3 library)

cocoa的記憶體管理主要依賴於reference counting, 而nsautoreleasepool就是用來支援它的. autorelease pool中存放的物件會在其自身乾枯(drain)時被release.

我們都知道當乙個object的release方法被觸發時, 這個物件就被銷毀了, 再也不能對它有任何引用, 否則就會出現異常. 但如果在銷毀它時觸發的是autorelease方法, 那這個object就進入了對應的autorelease pool, 它的生命就被延長了(當pool drain時才真正被銷毀).

在reference counting的環境裡, cocoa總是期望在每乙個thread都存在乙個autorelease pool, 如果不存在, 那些被autoreleased的objects就不會被銷毀, 從而產生memory leak. (印象中這種情況下xcode會在console打出warnning資訊)

nsautoreleasepool的初始化與普通的nsobject一樣, 都是alloc+init, 不過pool不能被retain, 因為在drain的時候預設就銷毀它自身了. 還有一點需要注意的是, 通常在銷毀pool的時候用的不是它的release方法, 而是drain! 原因是為了讓程式同時相容reference counting記憶體管理環境 與 garbge collection環境, 因為在garbage colloection環境中drain的作用是觸發collect garbage動作.

一般來說在應用的main thread中, 已經存在了乙個autorelease pool. 有兩種情況需要開發者自己新建autorelease pool:

在main thread中, 在某個方法中出現大量的autoreleased objects, 為了避免memory footprint的增大, 可以手動建立一些autorelease pool用來drain objects.

建立新的thread, 並在其中訪問了cocoa, 需要在訪問的前建立autorelease pool, 訪問結束後drain.

最後一點, 在每個thread中都會維持乙個stack, 其中放置著所有在這個thread中建立但未銷毀的pool, 每當乙個新的pool建立後, 它就位於stack的最頂端,  相應autoreleased object就會放入其中. 當pool drain的時候, 它就會從stack的頂端移除, 並且release掉其包含的objects.

@end

關於程式關於世界

首先,在學了1年多的軟體設計的基礎上,問下自己 程式是什麼?業務需求是什麼?程式有什麼用?什麼是演算法?什麼是資料庫?或許每個人的理解不同,會給出不同的答案。那麼自己的理解 程式是乙個讓計算機工作的流程,在程式寫好之後,計算機就會按照,程式設計師定義好流程在執行。其實很多時候,乙個程式的好壞,在於乙...

關於血液關於軟體

1 自然沉降法 將血袋垂直吊掛於4 2 冰箱內,使紅細胞自然下沉1 3d,或將血袋呈70 80 角立於冰箱,需用時,用一次性分漿器分出血漿,制得濃縮紅細胞。2 洗滌法 一般用生理鹽水反覆洗滌3 6次。經洗滌的紅細胞,除白細胞和血小板減少外,血漿蛋白也極少,紅細胞中殘存的血漿蛋白含量約為原總蛋白的1 ...

關於冷漠,關於愛情

我不知道為什麼今天又莫名其妙開始思考愛情這件事,隨之就解決了我一直無法面對冷漠這件事 被冷漠是我始終無法消化的一件事,每當遇見冷漠時,我總會覺得就像一團火把自己燒得面目全非,但對方卻毫無傷害。但我突然懂了,遇到冷漠時,體面的離開即可 在乎你的人一定會在你離開後,找到你跟你解釋為什麼 連解釋都來不及,...