iOS內(nèi)存管理1:引用計(jì)數(shù)

iOS內(nèi)存管理1:引用計(jì)數(shù)

引用計(jì)數(shù):

Objecttive-C使用引用計(jì)數(shù)來進(jìn)行內(nèi)存管理。
然后,引用計(jì)數(shù)其實(shí)是不準(zhǔn)的对粪。

引用計(jì)數(shù)原理:
retain 遞增引用計(jì)數(shù)
release 遞減引用計(jì)數(shù)
autorelease 清理「自動(dòng)釋放池」時(shí),在遞減保留計(jì)數(shù)
關(guān)于過早釋放對(duì)象而導(dǎo)致的bug:

若因某些原因,對(duì)象引用計(jì)數(shù)降至0刑枝,那么對(duì)象所在的內(nèi)存也許會(huì)回收,這樣的話迅腔,其他方法在調(diào)用此對(duì)象可能就使程序崩潰了装畅,這里說是可能,因?yàn)閷?duì)象所占用的內(nèi)存在『解除分配(deallocated)之后沧烈,只是放回「可用內(nèi)存池(avaiable pool)」』如果其他方法調(diào)用此對(duì)象時(shí)掠兄,尚未復(fù)寫對(duì)象內(nèi)存,那么該對(duì)象仍然有效锌雀,這時(shí)程序不會(huì)崩潰蚂夕。 這么說,可能不太好懂腋逆,上代碼:

NSMutableArray *array = [NSMutableArray array];
NSNumber *number = [[NSNumber alloc] initWithInt:1024];
[array addObject:number];
[number release];
NSLog(@"number = %@",number);
這里面我用NSNumber其實(shí)有點(diǎn)不厚道婿牍,但是主要還是讓您記住上面說的。
屬性存取方法中的內(nèi)存管理:

說一下set方法中的先儲(chǔ)存新值惩歉,再釋放舊值和先釋放舊值在儲(chǔ)存新值的區(qū)別:
首先等脂,先儲(chǔ)存新值,再釋放舊值更嚴(yán)謹(jǐn)一些柬泽。
嚴(yán)謹(jǐn)在哪里呢慎菲?

setNumber:(NSNumber *)number{
    
    [number retain];
    [number release];
    _number = number;
}

先說一下,NSNumber這個(gè)類型很特殊:
NSNumber *number1 = [[...alloc]int:11];
NSNumber *number2 = [[...alloc]int:11];
這個(gè)number1和number2的內(nèi)存地址是相同的锨并。
關(guān)于NSNumber的問題露该,如果想了解的話,可以看看第煮,唐巧前輩寫的這兩篇文章:
http://www.devtang.com/blog/2014/05/30/understand-tagged-pointer/
http://blog.xcodev.com/archives/tagged-pointer-and-64-bit/

    
經(jīng)jocker提醒解幼,setter方法建議這么寫
- (void)setBlackBoard:(Blackboard *)blackBoard
{
    if (_blackBoard != blackBoard) {
       [_blackBoard release];
       _blackBoard = [blackBoard retain];
  }
}

跑偏了抑党,我們往回說:
如果,新舊兩值指向同一個(gè)對(duì)象撵摆,那么若先執(zhí)行釋放底靠,就可能導(dǎo)致系統(tǒng)將此對(duì)象永久回收,而后續(xù)的保留操作對(duì)已經(jīng)回收的對(duì)象是無用的特铝,這個(gè)實(shí)例變量就變成了懸掛指針暑中。

自動(dòng)釋放池:

自動(dòng)釋放池和release的區(qū)別:
release會(huì)立刻遞減對(duì)象的保留計(jì)數(shù),可能令系統(tǒng)立即回收它鲫剿,注意是可能鳄逾。
自動(dòng)釋放池呢,假如自動(dòng)釋放池的對(duì)象灵莲,會(huì)稍后遞減雕凹,這個(gè)稍后一般指下一次event loop的時(shí)候,注意這里是一般,不是說絕對(duì)政冻。
自動(dòng)釋放池多用于跨方法調(diào)用枚抵,書上的原話說,自動(dòng)釋放池可以保證對(duì)象在跨越「方法調(diào)用邊界」(method call boundary)后一定存活明场,實(shí)際上汽摹,釋放操作會(huì)在清空最外層的自動(dòng)釋放池時(shí)執(zhí)行,除非你有自己的自動(dòng)釋放池榕堰,否則這個(gè)時(shí)機(jī)指的就是當(dāng)前線程的下一次事件循環(huán)竖慧。

循環(huán)引用

A對(duì)象中一個(gè)屬性是B的實(shí)例嫌套,B對(duì)象中一個(gè)屬性是C的實(shí)例逆屡,C對(duì)象中一個(gè)屬性是A的實(shí)例。這就構(gòu)成了循環(huán)引用踱讨。
當(dāng)然魏蔗,這么說是不嚴(yán)謹(jǐn)?shù)模囊桓模?br> A強(qiáng)引用了b痹筛,B強(qiáng)引用了c莺治,C強(qiáng)引用了a,這就構(gòu)成了循環(huán)引用帚稠。
解決的兩個(gè)方法:
1谣旁、改強(qiáng)引用為弱引用。
2滋早、從外屆命令循環(huán)中的某個(gè)對(duì)象榄审,不在引用另外一個(gè)對(duì)象。

釋放的時(shí)機(jī):

本文多次說了杆麸,可能會(huì)回收內(nèi)存搁进,可能會(huì)回收內(nèi)存浪感,內(nèi)存究竟在什么時(shí)候回收呢:

幾句話:

1.釋放操作是RunLoop管理的 要RunLoop運(yùn)行到釋放的時(shí)候才會(huì)被釋放,RunLoopEnterwaiting的時(shí)候就釋放了
2.釋放是統(tǒng)一處理的 不是某個(gè)對(duì)象為引用計(jì)數(shù)為0就把他立即釋放了饼问。
3.CoreFoundation對(duì)象和OC對(duì)象互轉(zhuǎn)的釋放問題 CF對(duì)象是不支持ARC的 要自己管理

參考:

Effective Objective-2.0 29Tip

感謝:
五角星群:絕影影兽,jocker,及其他群友莱革。
define_Coder群:張海龍峻堰,Archer,iOS小熊盅视,Calf等其他群友茧妒。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市左冬,隨后出現(xiàn)的幾起案子桐筏,更是在濱河造成了極大的恐慌,老刑警劉巖拇砰,帶你破解...
    沈念sama閱讀 222,590評(píng)論 6 517
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件梅忌,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡除破,警方通過查閱死者的電腦和手機(jī)牧氮,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,157評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來瑰枫,“玉大人踱葛,你說我怎么就攤上這事」獍樱” “怎么了尸诽?”我有些...
    開封第一講書人閱讀 169,301評(píng)論 0 362
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)盯另。 經(jīng)常有香客問我性含,道長(zhǎng),這世上最難降的妖魔是什么鸳惯? 我笑而不...
    開封第一講書人閱讀 60,078評(píng)論 1 300
  • 正文 為了忘掉前任商蕴,我火速辦了婚禮,結(jié)果婚禮上芝发,老公的妹妹穿的比我還像新娘绪商。我一直安慰自己,他們只是感情好辅鲸,可當(dāng)我...
    茶點(diǎn)故事閱讀 69,082評(píng)論 6 398
  • 文/花漫 我一把揭開白布格郁。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪理张。 梳的紋絲不亂的頭發(fā)上赫蛇,一...
    開封第一講書人閱讀 52,682評(píng)論 1 312
  • 那天,我揣著相機(jī)與錄音雾叭,去河邊找鬼悟耘。 笑死,一個(gè)胖子當(dāng)著我的面吹牛织狐,可吹牛的內(nèi)容都是我干的暂幼。 我是一名探鬼主播,決...
    沈念sama閱讀 41,155評(píng)論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼移迫,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼旺嬉!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起厨埋,我...
    開封第一講書人閱讀 40,098評(píng)論 0 277
  • 序言:老撾萬榮一對(duì)情侶失蹤邪媳,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后荡陷,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體雨效,經(jīng)...
    沈念sama閱讀 46,638評(píng)論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,701評(píng)論 3 342
  • 正文 我和宋清朗相戀三年废赞,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了徽龟。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,852評(píng)論 1 353
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡唉地,死狀恐怖据悔,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情耘沼,我是刑警寧澤极颓,帶...
    沈念sama閱讀 36,520評(píng)論 5 351
  • 正文 年R本政府宣布,位于F島的核電站耕拷,受9級(jí)特大地震影響讼昆,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜骚烧,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,181評(píng)論 3 335
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望闰围。 院中可真熱鬧赃绊,春花似錦、人聲如沸羡榴。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,674評(píng)論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至忠售,卻和暖如春传惠,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背稻扬。 一陣腳步聲響...
    開封第一講書人閱讀 33,788評(píng)論 1 274
  • 我被黑心中介騙來泰國(guó)打工卦方, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人泰佳。 一個(gè)月前我還...
    沈念sama閱讀 49,279評(píng)論 3 379
  • 正文 我出身青樓盼砍,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親逝她。 傳聞我的和親對(duì)象是個(gè)殘疾皇子浇坐,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,851評(píng)論 2 361

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

  • 29.理解引用計(jì)數(shù) Objective-C語(yǔ)言使用引用計(jì)數(shù)來管理內(nèi)存,也就是說黔宛,每個(gè)對(duì)象都有個(gè)可以遞增或遞減的計(jì)數(shù)...
    Code_Ninja閱讀 1,498評(píng)論 1 3
  • 內(nèi)存管理 簡(jiǎn)述OC中內(nèi)存管理機(jī)制近刘。與retain配對(duì)使用的方法是dealloc還是release,為什么臀晃?需要與a...
    丶逐漸閱讀 1,973評(píng)論 1 16
  • 內(nèi)存管理 ARC處理原理 ARC是Objective-C編譯器的特性跌宛,而不是運(yùn)行時(shí)特性或者垃圾回收機(jī)制,ARC所做...
    b485c88ab697閱讀 11,217評(píng)論 3 47
  • iOS內(nèi)存管理 概述 什么是內(nèi)存管理 應(yīng)用程序內(nèi)存管理是在程序運(yùn)行時(shí)分配內(nèi)存(比如創(chuàng)建一個(gè)對(duì)象,會(huì)增加內(nèi)存占用)與...
    蚊香醬閱讀 5,730評(píng)論 8 119
  • 泡一壺茶 茶杯已洗凈 茶葉已放進(jìn)壺中 只是在等水開 像在等一個(gè)人來 咕咚冒起的氣泡 一串或兩串 猜想著來訪之人 敲...
    娜塔莉斯閱讀 233評(píng)論 0 1