《Effective Objective-C 2.0編寫高質量iOS與OS X代碼的52個方法》要點回顧(五)第五章 內存管理

29. 理解引用計數

保留計數:表示當前有多少個事物想令此對象繼續存活下去。也可以叫“引用計數”(reference count)。NSObject協議聲明了3個方法用于操作計數器:

  • retain 遞增保留計數
  • release 遞減保留計數
  • autorelease 帶稍后清理“自動釋放池”時,再遞減保留計數。

根對象:兩者都是應用程序啟動時創建的單例。
Mac OS:此對象是NSApplication對象
iOS:此對象是UIApplication對象

要點總結

  • 引用計數機制通過可遞增遞減的計數器來管理內存。對象創建好之后,引用計數最少為1。若保留計數為正,則繼續保留。當保留計數為0時,對象就被銷毀了。
  • 在對象的聲明周期中,其它對象可通過引用計數保留或釋放對象。保留和釋放操作分別會遞增、遞減引用計數。

30. 以 ARC 簡化引用計數

要點總結

  • 啟用 ARC 之后,程序員就無需擔心內存管理問題了。使用 ARC 來編碼,可以少寫很多樣板式代碼。

  • ARC 管理對象生命周期的方法就是:在合適的地方自動插入“保留”或“釋放”操作。在 ARC 環境下,變量的內存管理語義可以通過修飾符知名,而原來則需要手動進行“保留”及“釋放”操作。

  • 由方法返回的對象,其內存管理語義總是通過方法名來實現。ARC 將此確定為開發者必須遵守的規則。

  • ARC 只負責管理Objective-C對象的內存。尤其要注意:CoreFoundation 對象不歸 ARC 管理,開發者必須適時調用CFRetain/CFRelease。

31. 在 dealloc 方法中只釋放引用并解除監聽

使用 ARC 時必須遵循的方法名規則

若方法名以下列詞語開頭,則其返回的對象歸調用者所有:

  • alloc
  • new
  • copy
  • mutableCopy
    注意:此時的對象的保留計數為正值。

變量的內存管理語義

  • __strong: 默認語義,保留其值
  • __unsafe_unretained: 不保留此值。這么做可能不安全,因為再次使用該變量時,其對象可能已經被回收了。
  • __weak: 不保留此值,但是變量可以安全使用,因為如果系統把這個變量回收了,那么變量也會自動清空。
  • __autoreleasing: 把對象“按引用傳遞”給方法時,使用這個特殊的修飾符。此值在方法返回時自動釋放。

要點總結

  • dealloc 里面,要做的就是釋放指向其它對象的引用,并取消“鍵值監察”(KVO)NSNotificationCenter 等通知,不要做其他事情。
  • 如果對象持有“系統文件描述符”等系統資源,那么應該專門編寫一個方法以釋放這種資源。這樣的類要和其使用者約定,用完資源后必須調用close方法。
  • 執行異步任務的方法不應在dealloc里調用;只有在正常狀態下執行的那些方法也不應在 dealloc 里調用,因為此時對象已經處于正在回收的狀態了。

32. 編寫 “異常安全代碼” 時留意內存管理問題

要點總結

  • 捕獲異常時,一定要注意將 try 塊內所創立的對象清理干凈。
  • 在默認情況下,ARC 不生成安全處理異常所需的清理代碼。開啟編譯器標志后,可以生成這種代碼,不過會導致應用程序變大,而且會降低運行效率。

33. 以弱引用避免保留環

要點總結

  • 將某些引用設置為weak,避免出現“保留環”。
  • weak 引用可以自動清空,也可以不自動清空。自動清空是隨著 ARC 而引入的新特性,由運行期系統來實現。在具備自動清空功能的若引用上,可以隨意讀取其數據,因為這種引用不會指向已經回收過的對象。

34. 以“自動釋放池塊”降低內存峰值

要點總結

  • 自動釋放池排布在中,對象收到 autorelease 消息后,系統將其放入最頂端的池里。
  • 合理運用自動釋放池,可以降低應用程序的內存峰值。
  • @autorelease 這種寫法能夠創建出更為輕便的自動釋放池。

35. 用 “僵尸對象” 調試內存管理問題

要點總結

  • 系統在回收對象時,可以不將其真的回收,而是將其轉成僵尸對象。通過環境變量 NSZombieEnabled 可開啟此功能。
  • 開啟后,系統會修改對象 isa 指針,使其指向特殊的僵尸類,從而使該對象變為僵尸對象。僵尸類能夠響應所有的選擇子,響應方式為:打印一條包含消息內容及其接收者的消息,然后終止程序。

36. 不要使用 retainCount

要點總結

  • 對象的保留計數看似有用,實則不然,因為任何給定時間點上的“絕對保留引用計數”都無法反映對象生命周期的全貌。
  • 引用 ARC 之后,retainCount方法就正式廢止了,在 ARC 模式下調用該方法會導致編譯器報錯。

系列文章

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 229,963評論 6 542
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 99,348評論 3 429
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 178,083評論 0 383
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,706評論 1 317
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 72,442評論 6 412
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 55,802評論 1 328
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,795評論 3 446
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,983評論 0 290
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 49,542評論 1 335
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 41,287評論 3 358
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 43,486評論 1 374
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 39,030評論 5 363
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,710評論 3 348
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 35,116評論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 36,412評論 1 294
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 52,224評論 3 398
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 48,462評論 2 378

推薦閱讀更多精彩內容