5.內(nèi)存管理

第29條 理解引用計數(shù)

引用計數(shù)每次alloc亮蒋、init之后陈肛,引用計數(shù)至少增加1唆鸡,因為init里可能有別的對象也引用了該對象名斟,所以說只能說至少增加1脑慧。

setter方法:

- (void)setName:(NSString *)name
{
    [name retain];
    [_name release];
    _name = name;
}

不能先寫[_name release];,一定要先retain砰盐,因為如果name和_name指向同一塊內(nèi)存闷袒,那相當(dāng)于把name釋放掉了,后面retain已經(jīng)沒效果了岩梳。

第30條 以ARC簡化引用計數(shù)

CoreFoundation對象不歸ARC管理囊骤,開發(fā)者需要手動調(diào)用CFRetain和CFRelease。

第31條 在dealloc方法里只釋放引用并解除監(jiān)聽

不要在dealloc方法里調(diào)用一些比較耗時(如異步)的方法冀值,因為對象可能會在方法完成前已經(jīng)釋放了也物。另外dealloc里的線程可能不是主線程,因為此時對象已經(jīng)處在回收的狀態(tài)了列疗。

第32條 編寫“異常安全代碼”時留意內(nèi)存管理問題

在try塊中滑蚯,如果一個對象被強(qiáng)引用了,在釋放該對象前拋出異常抵栈,那么除非catch塊能處理此問題告材,否則對象所占的內(nèi)存就泄露了。


ARC下問題可能會更嚴(yán)重:


在開啟ARC之后正常情況下一切和內(nèi)存有關(guān)的申請和釋放操作皆不用你關(guān)心了古劲,ARC全全幫你包辦了斥赋。但是還有極少數(shù)的情況下,編譯器無法為你生成合適的ARC額外代碼绢慢,比如obj-c異常就是這么一個例子灿渴。

話句話說在ARC中異常可能會導(dǎo)致對象的內(nèi)存泄露胰舆。因為ARC是顆辽叮化對象為一個文件:即可以在obj-c文件上啟用ARC.所以我們可以選擇性的在編譯某個文件上加上-fobjc-arc-exceptions選項,如果開啟了該選項缚窿,則ARC會額外為異常中的對象申請和釋放操作添加代碼棘幸,保證異常中ARC管理的對象也不會造成內(nèi)存泄露。當(dāng)然這樣一來缺點就是可能會生成大量平尘肓悖可能根本用不到的代碼误续。(只有發(fā)生異常才會執(zhí)行)

所以我們可以只在必要的obj-c文件上啟用-fobjc-arc-exceptions標(biāo)志,而其他文件禁用該標(biāo)志扫茅,這樣才可以做到萬無一失蹋嵌。

第33條 以弱引用避免保留環(huán)

weak和assign的區(qū)別

weak和assign的區(qū)別

第34條 以自動釋放池降低內(nèi)存峰值

主線程或GCD的線程中,都存在自動釋放池葫隙,每次執(zhí)行Event Loop時栽烂,就會將其清空。

第35條 用僵尸對象調(diào)試內(nèi)存管理問題

  • 向已經(jīng)被釋放的對象發(fā)送消息是不安全的,有時會崩潰腺办,有時不會焰手,取決于該對象的內(nèi)存是否已經(jīng)被其他內(nèi)容所覆寫。
  • 啟用了僵尸對象(Zombie object)后怀喉,運行期系統(tǒng)會把所有已經(jīng)被回收的對象轉(zhuǎn)為僵尸對象书妻,而不會真正的回收它們。這種對象所在的核心內(nèi)存無法重用躬拢,因此就無法被遭到覆寫躲履。僵尸對象收到消息后,會拋出異常估灿,準(zhǔn)確說明了發(fā)來的消息崇呵,并描述了回收之前的那個對象。
  • 具體過程馅袁,就是如果檢測到僵尸對象已經(jīng)打開,就通過swizzle方法將dealloc交換荒辕,然后在里面copy一份原來的對象汗销,然后改類名為 NSZOmbie_MyClass。
  • 系統(tǒng)會修改對象的isa指針抵窒,使其指向特殊的僵尸對象弛针,從而使對象變成僵尸對象。僵尸對象能夠響應(yīng)所有的選擇子李皇,響應(yīng)方式為:打印一條包含消息內(nèi)容及接收者的消息削茁,然后終止程序。

第36條 不要使用 retainCount

此方法即便在調(diào)試的時候也沒用掉房,原因是:它返回的保留計數(shù)只是某個時間點上的值茧跋,并未考慮到系統(tǒng)可能稍后就會把自動釋放池清空的情況。
如卓囚,錯誤代碼:

//問題1:若object已經(jīng)在自動釋放池里了瘾杭,稍后系統(tǒng)還會清空一次,會造成程序崩潰
//問題2:有時候系統(tǒng)會優(yōu)化哪亿,retainCount為1的時候就把對象釋放了粥烁,所有可能retainCount永遠(yuǎn)都不會為0
while ([object retainCount])
{
      [object release];
}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市蝇棉,隨后出現(xiàn)的幾起案子讨阻,更是在濱河造成了極大的恐慌,老刑警劉巖篡殷,帶你破解...
    沈念sama閱讀 222,627評論 6 517
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件钝吮,死亡現(xiàn)場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)搀绣,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,180評論 3 399
  • 文/潘曉璐 我一進(jìn)店門飞袋,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人链患,你說我怎么就攤上這事巧鸭。” “怎么了麻捻?”我有些...
    開封第一講書人閱讀 169,346評論 0 362
  • 文/不壞的土叔 我叫張陵纲仍,是天一觀的道長。 經(jīng)常有香客問我贸毕,道長郑叠,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 60,097評論 1 300
  • 正文 為了忘掉前任明棍,我火速辦了婚禮乡革,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘摊腋。我一直安慰自己沸版,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 69,100評論 6 398
  • 文/花漫 我一把揭開白布兴蒸。 她就那樣靜靜地躺著视粮,像睡著了一般。 火紅的嫁衣襯著肌膚如雪橙凳。 梳的紋絲不亂的頭發(fā)上蕾殴,一...
    開封第一講書人閱讀 52,696評論 1 312
  • 那天,我揣著相機(jī)與錄音岛啸,去河邊找鬼钓觉。 笑死,一個胖子當(dāng)著我的面吹牛值戳,可吹牛的內(nèi)容都是我干的议谷。 我是一名探鬼主播,決...
    沈念sama閱讀 41,165評論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼堕虹,長吁一口氣:“原來是場噩夢啊……” “哼卧晓!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起赴捞,我...
    開封第一講書人閱讀 40,108評論 0 277
  • 序言:老撾萬榮一對情侶失蹤逼裆,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后赦政,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體胜宇,經(jīng)...
    沈念sama閱讀 46,646評論 1 319
  • 正文 獨居荒郊野嶺守林人離奇死亡耀怜,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,709評論 3 342
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了桐愉。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片财破。...
    茶點故事閱讀 40,861評論 1 353
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖从诲,靈堂內(nèi)的尸體忽然破棺而出左痢,到底是詐尸還是另有隱情,我是刑警寧澤系洛,帶...
    沈念sama閱讀 36,527評論 5 351
  • 正文 年R本政府宣布俊性,位于F島的核電站,受9級特大地震影響描扯,放射性物質(zhì)發(fā)生泄漏定页。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 42,196評論 3 336
  • 文/蒙蒙 一绽诚、第九天 我趴在偏房一處隱蔽的房頂上張望典徊。 院中可真熱鬧,春花似錦憔购、人聲如沸宫峦。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,698評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至犀勒,卻和暖如春屎飘,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背贾费。 一陣腳步聲響...
    開封第一講書人閱讀 33,804評論 1 274
  • 我被黑心中介騙來泰國打工钦购, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人褂萧。 一個月前我還...
    沈念sama閱讀 49,287評論 3 379
  • 正文 我出身青樓押桃,卻偏偏與公主長得像,于是被迫代替她去往敵國和親导犹。 傳聞我的和親對象是個殘疾皇子唱凯,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,860評論 2 361

推薦閱讀更多精彩內(nèi)容