IOS開發(fā)過程中到逊,MRC環(huán)境下的內(nèi)存管理詳解

我們都知道铣口,在IOS開發(fā)的過程中,我們需要創(chuàng)建大量的對象觉壶,這些對象被存儲在堆上脑题,而系統(tǒng)并不會自動釋放堆中的內(nèi)存,(需要注意:基本類型是由系統(tǒng)自己管理的铜靶,是放在棧上的)叔遂。如果被創(chuàng)建的對象在使用完畢后沒有及時釋放掉,將會占用大量的內(nèi)存争剿。在其他的高級語言中已艰,比如說C#,Java等蚕苇,都是通過垃圾回收機制(CG)解決這個問題的哩掺。但是在Objc中并沒有類似于的垃圾回收機制,早起的內(nèi)存管理是在MRC環(huán)境下進行的涩笤,所以工程的內(nèi)存管理就需要開發(fā)人員手動進行管理疮丛。

【注意】在Xcode4.2及之后的版本中,由于引用了ARC機制辆它,程序在編譯時,Xcode可以自動給代碼添加內(nèi)存釋放代碼履恩,相信現(xiàn)在絕大多數(shù)人得Xcode版本都比4.2高锰茉,所以,要想充分理解Objc的內(nèi)存回收機制切心,需要大家手動關(guān)閉工程的ARC飒筑,否則片吊,如果在ARC環(huán)境下進行手動釋放,工程會報錯的协屡;

首先俏脊,內(nèi)存釋放的原則:因為對象的引用有時候過于錯綜復(fù)雜,對象之間有可能會相互交叉引用肤晓,為避免這種情況爷贫,需要遵循“誰創(chuàng)建,誰釋放”的原則补憾;

其次漫萄,是Objc內(nèi)存管理方法:

內(nèi)存管理的原理:當我們在工程中實例化一個對象之后,通常會有一個變量來引用這個對象盈匾,當這個引用變量不在使用的時候腾务,這時候就需要將此對象釋放掉,簡單的說就是:當一個對象沒有被任何變量引用時削饵,就將其回收岩瘦;

1、引用計數(shù)器

什么是引用計數(shù)器呢窿撬?就是在Objc中启昧,每個對象內(nèi)部都有一個與之對應(yīng)的整數(shù),這個整數(shù)就是“引用計數(shù)器”尤仍,當一個對象在創(chuàng)建之后箫津,他的引用計數(shù)器為1,當調(diào)用這個對象的alloc宰啦、retain苏遥、new、copy方法之后赡模,引用計數(shù)器會在原來的基礎(chǔ)上進行加1田炭,(在Objc中,調(diào)用一個對象方法就是給這個對象發(fā)送一個消息)漓柑,當調(diào)用這個對象的release方法之后教硫,它的引用計數(shù)會減1,如果一個對象的引用計數(shù)器為0辆布,則系統(tǒng)就會自動調(diào)用這個對象的dealloc 方法來銷毀這個對象瞬矩。在代碼中,一般使用dealloc方法來查看一個對象是否被回收锋玲,如果沒有被回收景用,則有可能會造成內(nèi)存泄露。如果確認一個對象已經(jīng)被釋放惭蹂,那么最后需要將他的變量手動設(shè)置為nil伞插,否則可能會造成野指針錯誤割粮,需要注意的是,在Objc中媚污,給空對象發(fā)送消息是不會報錯的舀瓢;

2、屬性參數(shù)

@property 的參數(shù)分為三類耗美;也就是說京髓,參數(shù)最多可以有三個,中間使用逗號進行分割幽歼,中間使用逗號進行分割朵锣,每類參數(shù)可以從上面三類表中選擇一個,如果不進行設(shè)置甸私,則會選用默認值诚些,默認參數(shù):atomic、readwrite皇型、assign ;如果在多線程的開發(fā)過程中诬烹,一個屬性可能被兩個及兩個以上的線程同時訪問,此時一般考慮atomic屬性弃鸦,否則建議使用nonatomic绞吁,不加鎖,效率高唬格;這里特別的說明一下set方法家破,其中,assign购岗,用于基本數(shù)據(jù)類型汰聋;retain,通常用于非字符串對象喊积;copy通常使用與字符串對象烹困、block對象、NSArray乾吻、NADictionary對象等髓梅;

3.自動釋放池

在Objc中,有一種內(nèi)存釋放的機制叫做“自動用于計數(shù)”(或“自動釋放池”)绎签,自動釋放池使用@autoreLease關(guān)鍵字聲明一個代碼塊枯饿,如果一個對象在初始化時,調(diào)用了autorelease方法诡必,那么在執(zhí)行完代碼塊之后鸭你,該對象就會自動調(diào)用一次release方法,這樣就起到了自動釋放的作用。

最后袱巨,自動釋放池的小總結(jié):

1、autorelease方法不會改變對象的引用計數(shù)碳抄,只是將這個對象添加到自動釋放池中愉老;

2、自動釋放池的實質(zhì)是當自動釋放池銷毀后剖效,統(tǒng)一調(diào)用一次對象的release方法嫉入,但不能保證該對象一定被銷毀掉;

3璧尸、由于自動釋放池最后統(tǒng)一銷毀對象咒林,因此,如果一個操作比較占用內(nèi)存爷光,最好不要放在自動釋放池中盡心銷毀垫竞。

4、Objc中蛀序,類庫中的靜態(tài)方法并不需要手動盡心釋放欢瞪,內(nèi)部已經(jīng)調(diào)用了autorelease方法;

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末徐裸,一起剝皮案震驚了整個濱河市遣鼓,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌重贺,老刑警劉巖骑祟,帶你破解...
    沈念sama閱讀 223,207評論 6 521
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異气笙,居然都是意外死亡次企,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,455評論 3 400
  • 文/潘曉璐 我一進店門健民,熙熙樓的掌柜王于貴愁眉苦臉地迎上來抒巢,“玉大人,你說我怎么就攤上這事秉犹◎让眨” “怎么了?”我有些...
    開封第一講書人閱讀 170,031評論 0 366
  • 文/不壞的土叔 我叫張陵崇堵,是天一觀的道長型诚。 經(jīng)常有香客問我,道長鸳劳,這世上最難降的妖魔是什么狰贯? 我笑而不...
    開封第一講書人閱讀 60,334評論 1 300
  • 正文 為了忘掉前任,我火速辦了婚禮,結(jié)果婚禮上涵紊,老公的妹妹穿的比我還像新娘傍妒。我一直安慰自己,他們只是感情好摸柄,可當我...
    茶點故事閱讀 69,322評論 6 398
  • 文/花漫 我一把揭開白布颤练。 她就那樣靜靜地躺著,像睡著了一般驱负。 火紅的嫁衣襯著肌膚如雪嗦玖。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,895評論 1 314
  • 那天跃脊,我揣著相機與錄音宇挫,去河邊找鬼。 笑死酪术,一個胖子當著我的面吹牛器瘪,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播拼缝,決...
    沈念sama閱讀 41,300評論 3 424
  • 文/蒼蘭香墨 我猛地睜開眼娱局,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了咧七?” 一聲冷哼從身側(cè)響起衰齐,我...
    開封第一講書人閱讀 40,264評論 0 277
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎继阻,沒想到半個月后耻涛,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,784評論 1 321
  • 正文 獨居荒郊野嶺守林人離奇死亡瘟檩,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,870評論 3 343
  • 正文 我和宋清朗相戀三年抹缕,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片墨辛。...
    茶點故事閱讀 40,989評論 1 354
  • 序言:一個原本活蹦亂跳的男人離奇死亡卓研,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出睹簇,到底是詐尸還是另有隱情奏赘,我是刑警寧澤,帶...
    沈念sama閱讀 36,649評論 5 351
  • 正文 年R本政府宣布太惠,位于F島的核電站磨淌,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏凿渊。R本人自食惡果不足惜梁只,卻給世界環(huán)境...
    茶點故事閱讀 42,331評論 3 336
  • 文/蒙蒙 一缚柳、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧搪锣,春花似錦秋忙、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,814評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至旁壮,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間谐檀,已是汗流浹背抡谐。 一陣腳步聲響...
    開封第一講書人閱讀 33,940評論 1 275
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留桐猬,地道東北人麦撵。 一個月前我還...
    沈念sama閱讀 49,452評論 3 379
  • 正文 我出身青樓,卻偏偏與公主長得像溃肪,于是被迫代替她去往敵國和親免胃。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 45,995評論 2 361

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

  • 29.理解引用計數(shù) Objective-C語言使用引用計數(shù)來管理內(nèi)存惫撰,也就是說羔沙,每個對象都有個可以遞增或遞減的計數(shù)...
    Code_Ninja閱讀 1,498評論 1 3
  • 概述 在iOS中開發(fā)中,我們或多或少都聽說過內(nèi)存管理厨钻。iOS的內(nèi)存管理一般指的是OC對象的內(nèi)存管理扼雏,因為OC對象分...
    DamonMok閱讀 4,006評論 2 20
  • 內(nèi)存管理 ARC處理原理 ARC是Objective-C編譯器的特性,而不是運行時特性或者垃圾回收機制夯膀,ARC所做...
    b485c88ab697閱讀 11,217評論 3 47
  • iOS內(nèi)存管理 概述 什么是內(nèi)存管理 應(yīng)用程序內(nèi)存管理是在程序運行時分配內(nèi)存(比如創(chuàng)建一個對象,會增加內(nèi)存占用)與...
    蚊香醬閱讀 5,732評論 8 119
  • 一幾一燈一孤樓诗充, 一書一畫一段愁, 一字一句一人曉诱建, 一生一世一份憂蝴蜓。
    古今之變閱讀 351評論 1 10