內(nèi)存問(wèn)題主要體現(xiàn)在兩個(gè)方面:內(nèi)存溢出和野指針異常
內(nèi)存的五大分區(qū)
棧區(qū) 系統(tǒng)開(kāi)辟,系統(tǒng)釋放,不需要我們管理
堆區(qū) 程序員自己管理的空間,自己申請(qǐng)空間,自己釋放
靜態(tài)區(qū) 將定義變量的類型前加static,則變量的分配在靜態(tài)區(qū)
常量區(qū) 常量數(shù)據(jù)存儲(chǔ)在常量區(qū),常量區(qū)的內(nèi)容不可修改,block就存在于常量區(qū)
代碼區(qū) 所有的語(yǔ)句編譯后生成的CPU指令存儲(chǔ)在代碼區(qū)
引用計(jì)數(shù)機(jī)制
- 在C語(yǔ)言中,使用molloc和free,進(jìn)行內(nèi)存的創(chuàng)建和釋放。
- 實(shí)際開(kāi)發(fā)中,可能會(huì)遇到兩個(gè)以上的指針使用同一塊內(nèi)存。C語(yǔ)言無(wú)法記錄內(nèi)存使用者的個(gè)數(shù)
- OC中采用引用計(jì)數(shù)機(jī)制來(lái)管理內(nèi)存,每個(gè)對(duì)象都有一個(gè)引用計(jì)數(shù)器,用來(lái)計(jì)算當(dāng)前對(duì)象的引用次數(shù)
- 當(dāng)一個(gè)新的引用指向?qū)ο髸r(shí),引用計(jì)數(shù)就加1,當(dāng)去掉一個(gè)引用時(shí),引用計(jì)數(shù)就減1.當(dāng)引用計(jì)數(shù)到0時(shí)該對(duì)象的系統(tǒng)空間就會(huì)被回收。
引用計(jì)數(shù)
舉例說(shuō)明:
- 第一個(gè)人進(jìn)入辦公室的人,需要開(kāi)燈“需要照明的人數(shù)”,計(jì)數(shù)值從0變成1.
- 之后每當(dāng)有人進(jìn)入辦公室,“需要照明的人數(shù)”就加1,此時(shí)計(jì)數(shù)值從1變成2.
- 每當(dāng)有人下班離開(kāi)辦公室,“需要照明的人數(shù)”就減1,計(jì)數(shù)值從2變成1.
- 最后一個(gè)人從下班離開(kāi)辦公室,“需要照明的人數(shù)”減1,計(jì)數(shù)值從1變成0,因此關(guān)燈。
在OC中“對(duì)象”就相當(dāng)于照明設(shè)備,“開(kāi)燈”就相當(dāng)于生成對(duì)象,需要照明就相當(dāng)于有別的對(duì)象需要持有當(dāng)前對(duì)象,“不需要照明”就相當(dāng)于要釋放對(duì)象的所有權(quán),“關(guān)燈”就相當(dāng)于發(fā)現(xiàn)當(dāng)前對(duì)象沒(méi)有被任何別的對(duì)象持有,就把這個(gè)對(duì)象銷(xiāo)毀,也就是釋放掉這個(gè)對(duì)象所占有的內(nèi)存。
影響引用計(jì)數(shù)的方法
- +alloc開(kāi)辟內(nèi)存空間,讓被開(kāi)辟的內(nèi)存空間的引用計(jì)數(shù)從0變?yōu)?.
- -retain引用計(jì)數(shù)j加1,如果對(duì)象之前的引用計(jì)數(shù)為1,retain之后變?yōu)?.
- -copy把某一對(duì)象的內(nèi)容拷貝一份,原有對(duì)象的引用計(jì)數(shù)不變,新對(duì)象的引用計(jì)數(shù)變1.
- -release引用計(jì)數(shù)立即減1
內(nèi)存管理原則
- 凡是使用了alloc,retain,或者copy讓內(nèi)存的引用計(jì)數(shù)增加了,就需要使用release或者autorelease讓內(nèi)存的引用計(jì)數(shù)減少,在一段代碼內(nèi),增加和減少的次數(shù)要相等。
- 如果增加的次數(shù)大于減少的次數(shù),會(huì)造成內(nèi)存泄漏。
- 如果增加的次數(shù)小于減少的次數(shù),會(huì)造成過(guò)度釋放。
- 如果增加的次數(shù)等于減少的次數(shù),還繼續(xù)訪問(wèn),造成野指針的問(wèn)題。
修飾屬性的關(guān)鍵字
strong:強(qiáng)引用,ARC中使用,與MRC中的retain類似。
weak:弱引用,ARC使用,如果對(duì)象釋放了,則指針會(huì)指向nil,避免野指針。
assign:弱引用,基本上應(yīng)用于基本數(shù)據(jù)類型。
copy:拷貝特性,對(duì)象拷貝,需遵循NSCoding協(xié)議mutableCopy是深拷貝,創(chuàng)建了一個(gè)一樣的對(duì)象。
readonly:只讀屬性,只生成getter方法,不生成setter方法。
atotic:原子特性,setter、getter方法在多線程訪問(wèn)下是絕對(duì)安全的,也就是個(gè)setter、getter方法加了線程鎖,保證在同一時(shí)刻只有一個(gè)線程在訪問(wèn)。
nonatotic:非原子特性,setter,getter方法內(nèi)部不會(huì)做任何多線程的訪問(wèn)處理,只是普通的setter、getter,方法。