關於autorelease pool乙個較好的理解

2022-02-05 10:10:03 字數 1257 閱讀 9308

如果你能夠真正的理解autorelease,那麼你才是理解了objective c的記憶體管理。autorelease實際上只是把對release的呼叫延遲了,對於每乙個autorelease,系統只是把該object放入了當前的autorelease pool中,當該pool被釋放時,該pool中的所有object會被呼叫release。

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

答案是,對於每乙個runloop, 系統會隱式建立乙個autorelease pool,這樣所有的release pool會構成乙個象callstack一樣的乙個棧式結構,在每乙個runloop結束時,當前棧頂的autorelease pool會被銷毀,這樣這個pool裡的每個object會被release。

那什麼是乙個runloop呢? 乙個ui事件,timer call, delegate call, 都會是乙個新的runloop。autorelease是保證乙個method安全的,對於method中的函式呼叫也適用。例子如下:

nsstring* globalobject;

-(ibaction)onbuttonclicked

[2]為什麼需要auto release ?

2.1)很多c/c++轉過來的程式設計師會說,這個auto release有什麼好,象c/c++那樣,自己申請,自己釋放,完全可控不好麼, 這個auto relase 完全不可控,你都不知到它什麼時候會被真正的release。我的理解它有乙個作用就是可以做到每個函式對自己申請的物件負責,自己申請,自己釋放,該函式的呼叫者不需要關心它內部申請物件的管理。 在下面這個例子中,func1的呼叫者不需要再去關心obj的釋放。

classa *func1()

實際上對於 [nsstring stringwithformat:] 這類建構函式返回的物件都是autorelease的。

2.2) autorelease pool來避免頻繁申請/釋放記憶體(就是pool的作用了)。這個應該是相對比較好理解的。

總結:1)一定要注意autorelease pool的生存週期,理解runloop,避免在物件被釋放後使用。

2)[nsstring stringwithformat:]這類函式返回的物件是不需要再自己release的,它已經被autorelease了, 如果你想把它當乙個全域性物件使用,那必須自己再retain, 釋放時再release。

關於程式關於世界

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

關於血液關於軟體

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

關於冷漠,關於愛情

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