day9---內(nèi)存管理

一 內(nèi)存管理

一 什么是內(nèi)存管理犯助?
就是確保開(kāi)辟的“堆空間”被正確的釋放什湘。

二 為什么要內(nèi)存管理?
1.移動(dòng)設(shè)備的內(nèi)存都是極其有限的声怔,每個(gè)app所占用的內(nèi)存是非常有限的。

2.當(dāng)app所占的內(nèi)存較多的時(shí)候舱呻,系統(tǒng)會(huì)發(fā)出警告醋火,必須要銷毀掉一些不使用的空間,但如  果系統(tǒng)回收掉之后箱吕,還是占用太多芥驳,app就會(huì)閃退的情況。

3.管理范圍:任何繼承了NSObject的對(duì)象茬高,而對(duì)于其他的基礎(chǔ)數(shù)據(jù)類型(int兆旬,char。雅采。結(jié)    構(gòu)體爵憎,1枚舉)無(wú)效慨亲,因?yàn)檫@些東西都是系統(tǒng)自動(dòng)回收,本質(zhì)原因是因?yàn)檫@些基礎(chǔ)數(shù)據(jù)類型    存放的空間跟“對(duì)象”不一樣宝鼓。

三 OC中的內(nèi)存管理的方式: //輸入gar進(jìn)行切換
1.手動(dòng)內(nèi)存管理(MRC)
2.自動(dòng)內(nèi)存管理(ARC)Automatic Reference Counting

四 為什么要學(xué)習(xí)手動(dòng)內(nèi)存管理
1.要理解自動(dòng)內(nèi)存管理刑棵,必須以手動(dòng)內(nèi)存管理為基礎(chǔ);
2.使用ARC愚铡,可能會(huì)因?yàn)榇a的不規(guī)范蛉签,導(dǎo)致內(nèi)存各種問(wèn)題。沥寥。
3.導(dǎo)入的第三方庫(kù)碍舍,或者一些舊文件,這些代碼都不支持ARC邑雅。片橡。
4.一些公司崇拜MRC;
5.面試淮野;

五 學(xué)習(xí)內(nèi)存管理會(huì)遇到以下問(wèn)題:
內(nèi)存泄露:如果堆空間沒(méi)有被釋放捧书;
重復(fù)釋放:同一個(gè)空間被釋放多次;
提前釋放:釋放了還需要使用的空間骤星;

六 引用計(jì)數(shù)器的概念
1.為了解決以上問(wèn)題经瓷,OC引用了“引用計(jì)數(shù)器”的概念
1)每個(gè)對(duì)象一創(chuàng)建出來(lái),就默認(rèn)有一個(gè)“引用計(jì)數(shù)器”的屬性洞难,是一個(gè)整數(shù)舆吮,表 示“該對(duì)象被引用的次數(shù)”,即有多少人正在使用這個(gè)對(duì)象队贱;

    2)每個(gè)OC對(duì)象的內(nèi)部專門(mén)有4個(gè)字節(jié)的存儲(chǔ)空間來(lái)存儲(chǔ)引用計(jì)數(shù)器的值色冀;


2.引用計(jì)數(shù)器的操作
    1)當(dāng)我們使用alloc,new露筒,或者copy創(chuàng)建一個(gè)新對(duì)象的時(shí)候呐伞,新對(duì)象的引用計(jì)數(shù)器         的值“ +1 ”;

    2)當(dāng)我們給對(duì)象發(fā)送retain消息的時(shí)候慎式,可以使得該對(duì)象的引用計(jì)數(shù)器的值 +1 伶氢;

    3)當(dāng)給對(duì)象發(fā)送一條release消息的時(shí)候,可以使得改對(duì)象的引用計(jì)數(shù)器的值 -1瘪吏;

    4)當(dāng)一個(gè)對(duì)象的引用計(jì)數(shù)器的值為0的時(shí)候癣防,代表著該對(duì)象沒(méi)有人使用了,對(duì)象的內(nèi)          存就會(huì)被系統(tǒng)回收掌眠,這個(gè)時(shí)候系統(tǒng)的內(nèi)部會(huì)自動(dòng)的調(diào)用dealloc方法來(lái)回收內(nèi)           存蕾盯;

    Person *p1 = [[Person alloc] init];//1
    Person *p2 = [p1 retain];//2            //用新指針指向原來(lái)的指針時(shí),原來(lái)指針                                         調(diào)用retain方法蓝丙;
    Person *p3 = [p1 retain];//3

    [p3 release];//2
    [p2 release];//1
    [p1 release];//0

總結(jié):
1.retain:引用計(jì)數(shù)器的值+1级遭;

2.release:引用計(jì)數(shù)器的值-1望拖;

3.retaincount:獲得當(dāng)前對(duì)象的引用計(jì)數(shù)器的值;

4.對(duì)象銷毀:
    1)當(dāng)一個(gè)對(duì)象的引用計(jì)數(shù)器的值為0時(shí)挫鸽,那么它將被銷毀说敏;
    2)當(dāng)一個(gè)對(duì)象被銷毀的時(shí)候,系統(tǒng)的內(nèi)部會(huì)自動(dòng)的調(diào)用dealloc方法丢郊,     3)一般重寫(xiě)dealloc方法盔沫,在這個(gè)方法里面釋放相關(guān)資源,就好比對(duì)象的遺言枫匾;
    4)一旦重寫(xiě)了dealloc方法架诞,就在MRC下,就必須調(diào)用[super dealloc],且放在最           后調(diào)用干茉;在ARC下谴忧,不需要調(diào)用;
    5)不要直接接受調(diào)用dealloc方法角虫;
    6)一旦對(duì)象被回收俏蛮,它就成為了僵尸對(duì)象,堅(jiān)持使用對(duì)象程序會(huì)發(fā)生崩潰上遥;



內(nèi)存管理的黃金法則:
1.凡是使用alloc,new争涌,copy(mutablecopy)粉楚,retain的時(shí)候,引用計(jì)數(shù)器的值+1亮垫,  那么必須使用release或者autorelease方法模软,當(dāng)使用release,引用計(jì)數(shù)器的值-1饮潦,當(dāng)引用   計(jì)數(shù)器的值為0燃异,這個(gè)對(duì)象才會(huì)被銷毀;

2.誰(shuí)創(chuàng)建誰(shuí)release(誰(shuí)寫(xiě)的alloc继蜡,誰(shuí)release)回俐;

二 多個(gè)對(duì)象的內(nèi)存管理
Person(擁有一輛汽車(chē))
Car
【Demo】-【2-多個(gè)對(duì)象的內(nèi)存管理】

三 不可變字符串的內(nèi)存管理
用copy修飾字符串,是為了防止外界隨意更改相關(guān)內(nèi)容稀并;
不管是可變字符串還是不可變字符串仅颇,始終堅(jiān)持內(nèi)存管理的黃金法則來(lái)管理內(nèi)存就不會(huì)出錯(cuò);

四 數(shù)組的內(nèi)存管理
遵守黃金法則
見(jiàn)【Demo】-【5-數(shù)組的內(nèi)存管理】

五 copy和MutableCopy的區(qū)別 用于字符串碘举、數(shù)組忘瓦、字典

copy:不管對(duì)象之前是可變的還是不可變的,那么copy之后引颈,返回的新對(duì)象一定是不可變         的耕皮;

MutableCopy:不管對(duì)象之前是可變的還是不可變的境蜕,那么MutableCopy之后,返回的            新對(duì)象一定是可變的凌停;

見(jiàn)【Demo】-【6-copy和mutableCopy】

六 自動(dòng)釋放池
自動(dòng)釋放池就是為了幫我們把對(duì)象達(dá)到一個(gè)延遲銷毀的目的粱年;

什么是自動(dòng)釋放池?
自動(dòng)釋放池就好比一個(gè)容器苦锨,當(dāng)給某個(gè)對(duì)象發(fā)送autorelease消息的時(shí)候逼泣,就會(huì)將這個(gè)對(duì)象   加入到離它最近的自動(dòng)釋放池中,當(dāng)池子銷毀的時(shí)候舟舒,系統(tǒng)內(nèi)部會(huì)自動(dòng)的對(duì)該池子中所有的    對(duì)象執(zhí)行release一次拉庶,這樣就可以達(dá)到延遲銷毀的目的;

見(jiàn)【Demo】-【7-自動(dòng)釋放池】

【問(wèn)】autorelease是讓對(duì)象的引用計(jì)數(shù)器-1碼秃励?
【答】不是氏仗,autorelease只是把對(duì)象加入了自動(dòng)釋放池中,只有當(dāng)池子銷毀的時(shí)候夺鲜,系統(tǒng)       才會(huì)自動(dòng)的對(duì)池子中所有的對(duì)象發(fā)送一次release消息皆尔;

總結(jié):
1.對(duì)象的成員變量(OC對(duì)象)在init構(gòu)造方法中創(chuàng)建,應(yīng)該dealloc方法中release币励;

2.對(duì)象的屬性使用retain慷蠕,copy修飾的,那么食呻,應(yīng)該在dealloc方法中release流炕;

3.字符串表面上不遵守內(nèi)存管理原則,但我們依然要用黃金法則來(lái)管理仅胞,即每一個(gè)+對(duì)應(yīng)一       個(gè)-每辟;
內(nèi)存管理的黃金法則:
1)凡是使用alloc,new干旧,copy(mutablecopy)渠欺,retain的時(shí)候,引用計(jì)數(shù)器的值 +1椎眯, 那么必須使用release或者autorelease方法挠将,當(dāng)使用release,引用計(jì)數(shù)器的值-1盅视,  當(dāng)引用計(jì)數(shù)器的值為0捐名,這個(gè)對(duì)象才會(huì)被銷毀;

2)誰(shuí)創(chuàng)建誰(shuí)release(誰(shuí)寫(xiě)的alloc闹击,誰(shuí)release)镶蹋;


4.單例對(duì)象是個(gè)例外,不用釋放,因?yàn)檎麄€(gè)工程隨時(shí)都有可能要用到單例對(duì)象贺归,隨著工程退   出淆两,而銷毀!

5.release和autorelease的區(qū)別拂酣;

6.copy和mutableCopy的區(qū)別秋冰;
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市婶熬,隨后出現(xiàn)的幾起案子剑勾,更是在濱河造成了極大的恐慌,老刑警劉巖赵颅,帶你破解...
    沈念sama閱讀 211,423評(píng)論 6 491
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件虽另,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡饺谬,警方通過(guò)查閱死者的電腦和手機(jī)捂刺,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,147評(píng)論 2 385
  • 文/潘曉璐 我一進(jìn)店門(mén),熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)募寨,“玉大人族展,你說(shuō)我怎么就攤上這事“斡ィ” “怎么了仪缸?”我有些...
    開(kāi)封第一講書(shū)人閱讀 157,019評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)列肢。 經(jīng)常有香客問(wèn)我腹殿,道長(zhǎng),這世上最難降的妖魔是什么例书? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 56,443評(píng)論 1 283
  • 正文 為了忘掉前任,我火速辦了婚禮刻炒,結(jié)果婚禮上决采,老公的妹妹穿的比我還像新娘。我一直安慰自己坟奥,他們只是感情好树瞭,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,535評(píng)論 6 385
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著爱谁,像睡著了一般晒喷。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上访敌,一...
    開(kāi)封第一講書(shū)人閱讀 49,798評(píng)論 1 290
  • 那天凉敲,我揣著相機(jī)與錄音,去河邊找鬼。 笑死爷抓,一個(gè)胖子當(dāng)著我的面吹牛势决,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播蓝撇,決...
    沈念sama閱讀 38,941評(píng)論 3 407
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼果复,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了渤昌?” 一聲冷哼從身側(cè)響起虽抄,我...
    開(kāi)封第一講書(shū)人閱讀 37,704評(píng)論 0 266
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎独柑,沒(méi)想到半個(gè)月后迈窟,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,152評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡群嗤,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,494評(píng)論 2 327
  • 正文 我和宋清朗相戀三年菠隆,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片狂秘。...
    茶點(diǎn)故事閱讀 38,629評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡骇径,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出者春,到底是詐尸還是另有隱情破衔,我是刑警寧澤,帶...
    沈念sama閱讀 34,295評(píng)論 4 329
  • 正文 年R本政府宣布钱烟,位于F島的核電站晰筛,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏拴袭。R本人自食惡果不足惜读第,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,901評(píng)論 3 313
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望拥刻。 院中可真熱鬧怜瞒,春花似錦、人聲如沸般哼。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,742評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)蒸眠。三九已至漾橙,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間楞卡,已是汗流浹背霜运。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,978評(píng)論 1 266
  • 我被黑心中介騙來(lái)泰國(guó)打工脾歇, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人觉渴。 一個(gè)月前我還...
    沈念sama閱讀 46,333評(píng)論 2 360
  • 正文 我出身青樓介劫,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親案淋。 傳聞我的和親對(duì)象是個(gè)殘疾皇子座韵,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,499評(píng)論 2 348

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

  • 內(nèi)存管理 簡(jiǎn)述OC中內(nèi)存管理機(jī)制。與retain配對(duì)使用的方法是dealloc還是release踢京,為什么誉碴?需要與a...
    丶逐漸閱讀 1,950評(píng)論 1 16
  • 29.理解引用計(jì)數(shù) Objective-C語(yǔ)言使用引用計(jì)數(shù)來(lái)管理內(nèi)存,也就是說(shuō)瓣距,每個(gè)對(duì)象都有個(gè)可以遞增或遞減的計(jì)數(shù)...
    Code_Ninja閱讀 1,475評(píng)論 1 3
  • iOS內(nèi)存管理 概述 什么是內(nèi)存管理 應(yīng)用程序內(nèi)存管理是在程序運(yùn)行時(shí)分配內(nèi)存(比如創(chuàng)建一個(gè)對(duì)象,會(huì)增加內(nèi)存占用)與...
    蚊香醬閱讀 5,704評(píng)論 8 119
  • 內(nèi)存管理是程序在運(yùn)行時(shí)分配內(nèi)存黔帕、使用內(nèi)存,并在程序完成時(shí)釋放內(nèi)存的過(guò)程蹈丸。在Objective-C中成黄,也被看作是在眾...
    蹲瓜閱讀 3,027評(píng)論 1 8
  • 11.看下面的程序,第一個(gè)NSLog會(huì)輸出什么?這時(shí)str的retainCount是多少逻杖?第二個(gè)和第三個(gè)呢奋岁? 為什...
    AlanGe閱讀 724評(píng)論 1 4