一 內(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ū)別秋冰;