《深層次探索系統(tǒng)的內存管理(mrc至arc)》

說明:本文為學習筆記匆笤,參考書籍《Objective-C高級編程ios與osx多線程與內存管理》,僅供自我學習。

大家看到內存的第一反應就會想到自動引用計數(shù)俘闯,其實引用計數(shù)式內存管理僅僅是思考方式而已。我們需要理解4個詞“生成”“持有”“釋放”“銷毀”忽冻。

自己持有的對象真朗,一旦不再需要,持有者有義務釋放該對象僧诚,釋放時調用release方法遮婶。對象如果被釋放掉了就絕對不能被訪問。這也是為block要在堆上面的原因湖笨。

自己生成而非自己所持有對象旗扑,若用retain方法變?yōu)樽约撼钟校餐瑯涌梢杂胷elease方法釋放掉慈省。

使用autrorelease方法臀防,可以取的對象,但自己不持有對象辫呻。autorelease提供這樣的功能清钥,使對象在超出指定的生存范圍時能夠自動并正確的釋放(調用release方法)。

自己不能釋放非自己持有的對象放闺。一旦釋放會導致奔潰祟昭。

下面我們直接看代碼。

NSAllocateObject函數(shù)通過調用NSZoneMalloc函數(shù)來分配存放對象所需的內存空間怖侦,之后將該內存空間置0篡悟,最后返回作為對象而使用的指針谜叹。

對象的引用計數(shù)可以通過retainCount實例方法獲得。引用計數(shù)為0時搬葬,調用dealloc方法來銷毀對象荷腊。

引用計數(shù)表是一個散列表。

autrorelease當前超出作用域(相當于變量作用域時)急凰,對象實例的release實例方法被調用女仰。

NSAutoreleasePool對象的生存周期相當于C語言變量的作用域。對于所有調用過NSAutorelease實例方法的對象抡锈,在NSAutorepleasePool對象時疾忍,都將調用release方法。用源碼表示如下圖:

在Cocoa框架中床三,相當于程序主循環(huán)的NSRunLoop或者在其他程序可運行的地方一罩,對NSAutoreleasePool對象進行生成,持有和銷毀處理撇簿。因此應用程序開發(fā)者并不一定得使用NSAutoreleasePool對象來進行開發(fā)工作聂渊。

NSRunLoop每次循環(huán)對過程都會不斷執(zhí)行一個操作。生成NSAutoreleasePool對象四瘫,應用主程序處理銷毀NSAutoreleasePool對象汉嗽。

盡管如此,但在大量長生autorelease的對象時找蜜,只要不銷毀NSAutoreleasePool對象诊胞,那么生成的對象就不會被釋放,因此有時會產生內存不足的現(xiàn)象锹杈。比如讀入大量圖像的同時改變其尺寸。圖像文件讀入到NSData對象迈着,并從中生成UIImage對象竭望,改成尺寸后生成新的autorelease的對象。由于沒有銷毀NSAutoreleasePool對象裕菠,最終會導致內存不足咬清。

解決方法,有必要在適當?shù)牡胤缴膳耍钟谢蛘咪N毀NSAutoreleasePool對象旧烧。

通常在使用OC中,也就是Foundation框架時画髓,無論調用哪一個對象的autorelease實例方法掘剪,實現(xiàn)上是調用的都是NSObject類的aurorelease實例方法。但是對于NSAutoreleasePool類奈虾,autorelease實例方法已經被該類重載夺谁,因此運行時會報錯廉赔。

在ARC中也是遵循下面的規(guī)則的:

因此新引入4個屬性修飾符:

__strong 修飾符是id類型和對象類型默認的所有權修飾符。也就是說匾鸥,id變量蜡塌,實際上是被附加了所有權修飾符。

接下來我們看看__weak,其存在主要是為了解決相互持有造成內存泄漏的問題勿负。

接下來我們看看__unsafe_unretained修飾符:

接下來我們看看__autoreleasing修飾符

使用__week修飾的對象必定被注冊到authoreleasepool中的對象馏艾。

在iOS應用程序模版中,像下面的main函數(shù)一樣奴愉,@authoreleasepool塊包含了全部程序琅摩。

NSRunLoop等實現(xiàn)不論是否ARC,均能隨時釋放注冊到autoreleasepoo;中的對象 。

無論是否ARC,只要對象的所有者不持有該對象躁劣,該對象就被銷毀迫吐,也就是走dealloc方法。

另外账忘,在不是ARC無效時必須要調用[super dealloc]志膀。ARC的時候不必書寫這個。

另外Core Founation對象框架生成的API生成并持有的對象可以用CoreFoundation框架的API進行釋放鳖擒。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末溉浙,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子蒋荚,更是在濱河造成了極大的恐慌戳稽,老刑警劉巖,帶你破解...
    沈念sama閱讀 221,820評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件期升,死亡現(xiàn)場離奇詭異惊奇,居然都是意外死亡,警方通過查閱死者的電腦和手機播赁,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,648評論 3 399
  • 文/潘曉璐 我一進店門颂郎,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人容为,你說我怎么就攤上這事乓序。” “怎么了坎背?”我有些...
    開封第一講書人閱讀 168,324評論 0 360
  • 文/不壞的土叔 我叫張陵替劈,是天一觀的道長。 經常有香客問我得滤,道長陨献,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 59,714評論 1 297
  • 正文 為了忘掉前任懂更,我火速辦了婚禮湿故,結果婚禮上阿趁,老公的妹妹穿的比我還像新娘。我一直安慰自己坛猪,他們只是感情好脖阵,可當我...
    茶點故事閱讀 68,724評論 6 397
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著墅茉,像睡著了一般命黔。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上就斤,一...
    開封第一講書人閱讀 52,328評論 1 310
  • 那天悍募,我揣著相機與錄音,去河邊找鬼洋机。 笑死坠宴,一個胖子當著我的面吹牛,可吹牛的內容都是我干的绷旗。 我是一名探鬼主播喜鼓,決...
    沈念sama閱讀 40,897評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼衔肢!你這毒婦竟也來了庄岖?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 39,804評論 0 276
  • 序言:老撾萬榮一對情侶失蹤角骤,失蹤者是張志新(化名)和其女友劉穎隅忿,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體邦尊,經...
    沈念sama閱讀 46,345評論 1 318
  • 正文 獨居荒郊野嶺守林人離奇死亡背桐,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 38,431評論 3 340
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了蝉揍。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片牢撼。...
    茶點故事閱讀 40,561評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖疑苫,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情纷责,我是刑警寧澤捍掺,帶...
    沈念sama閱讀 36,238評論 5 350
  • 正文 年R本政府宣布,位于F島的核電站再膳,受9級特大地震影響挺勿,放射性物質發(fā)生泄漏。R本人自食惡果不足惜喂柒,卻給世界環(huán)境...
    茶點故事閱讀 41,928評論 3 334
  • 文/蒙蒙 一不瓶、第九天 我趴在偏房一處隱蔽的房頂上張望禾嫉。 院中可真熱鬧,春花似錦蚊丐、人聲如沸熙参。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,417評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽孽椰。三九已至,卻和暖如春凛篙,著一層夾襖步出監(jiān)牢的瞬間黍匾,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,528評論 1 272
  • 我被黑心中介騙來泰國打工呛梆, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留锐涯,地道東北人。 一個月前我還...
    沈念sama閱讀 48,983評論 3 376
  • 正文 我出身青樓填物,卻偏偏與公主長得像纹腌,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子融痛,可洞房花燭夜當晚...
    茶點故事閱讀 45,573評論 2 359

推薦閱讀更多精彩內容