- 基本原理
(—)為什么要進(jìn)行內(nèi)存管理
由于移動(dòng)設(shè)備的內(nèi)存有限嗜憔,每個(gè)app所占的內(nèi)存是及其有限的,當(dāng)app所占用的內(nèi)存較多時(shí)氏仗,系統(tǒng)就會(huì)發(fā)出內(nèi)存警告吉捶,這時(shí)需要回收一些不需要再繼續(xù)使用的內(nèi)存空間,比如回收一些不再使用的對象和變量等,因此我們需要管理內(nèi)存皆尔。
不過也不是所有的對象都需要我們回收呐舔,凡是繼承自NSObject的OC對象才需要我們管理,因?yàn)樗麄兪谴娣旁诙褏^(qū)中慷蠕。至于一些基本的數(shù)據(jù)類型比如(整型珊拼,浮點(diǎn)型,枚舉流炕,結(jié)構(gòu)圖澎现,布爾)還有一些局部變量是存放在椊霭空間中的,當(dāng)代碼塊結(jié)束的時(shí)候剑辫,他們也就自動(dòng)回收了干旧!
(二)如何管理內(nèi)存
在Ios5之前,都是需要手動(dòng)管理內(nèi)存的也就是MRC妹蔽,原理很簡單椎眯,通過自動(dòng)引用計(jì)數(shù)控制,當(dāng)創(chuàng)建一個(gè)對象或者想擁有一個(gè)對象胳岂,那么該對象就會(huì)發(fā)送retain(引用計(jì)數(shù)+1)消息盅视,當(dāng)不想擁有這個(gè)對象,該對象就會(huì)發(fā)送release(引用計(jì)數(shù)-1)消息旦万,直到當(dāng)一個(gè)對象的引用計(jì)數(shù)為0的時(shí)候闹击,就會(huì)調(diào)用對象的dealloc方法,這時(shí)候系統(tǒng)就知道該對象要被回收成艘!
不過蘋果爸爸為了減輕開發(fā)者的負(fù)擔(dān)赏半,在Ios5之后,給廣大Ios開發(fā)者傳來了好消息淆两,推出了ARC(Automatic Reference Counting)断箫,全稱為自動(dòng)引用計(jì)數(shù),也就是代碼中自動(dòng)加入了retain/release秋冰,原先需要手動(dòng)添加的用來處理內(nèi)存管理的引用計(jì)數(shù)的代碼可以自動(dòng)地由編譯器完成了仲义。
(三)內(nèi)存管理代碼規(guī)范
- 只要調(diào)用了alloc,就必須有release(autorelease)
- set方法的代碼規(guī)范
基本數(shù)據(jù)類型:直接賦值
- (void)setHeight:(CGFloat)height{
_height = height;
}
OC對象類型:直接賦值
- (void)setBook:(Book *)book{
if (_book!=book) {//先判斷是不是新傳進(jìn)來的對象
[_book release];//對舊對象做一次release
_book = [book retain];//對新對象做一次retain
}
}
- dealloc方法的代碼規(guī)范
- (void)dealloc{// 臨終遺言
NSLog(@"人被釋放");
[_book release];// 對擁有的對象做一次release
[super dealloc];//MRC一定要調(diào)用
}
(四) @property的參數(shù)
(1)內(nèi)存管理相關(guān)參數(shù)
Retain:對對象release舊值剑勾,retain新值(適用于OC對象類型)
Assign:直接賦值(默認(rèn)埃撵,適用于非oc對象類型)
Copy:release舊值,copy新值
(2)是否要生成set方法(若為只讀屬性虽另,則不生成)
Readonly:只讀暂刘,只會(huì)生成getter的聲明和實(shí)現(xiàn)
Readwrite:默認(rèn)的,同時(shí)生成setter和getter的聲明和實(shí)現(xiàn)
(3)多線程管理(蘋果在一定程度上屏蔽了多線程操作)
Nonatomic:高性能捂刺,一般使用這個(gè)谣拣,蘋果推薦使用這個(gè)
Atomic:低性能
(4)Set和get方法的名稱
- 修改set和get方法的名稱,主要用于布爾類型族展。因?yàn)榉祷夭紶栴愋偷姆椒话阋?strong>is開頭森缠,修改名稱一般用在布爾類型中的getter。
@propery(setter=setAbc,getter=isRich) BOOL rich;
BOOL b=p.isRich;// 調(diào)用
(五) 內(nèi)存管理中的循環(huán)引用問題以及解決
案例:每個(gè)人有一張身份證仪缸,每張身份證對應(yīng)一個(gè)人贵涵,不能使用#import的方式相互包含,這就形成了循環(huán)引用。
新的關(guān)鍵字:@class 類名独悴;——解決循環(huán)引用問題例书,提高性能
@class僅僅告訴編譯器,在進(jìn)行編譯的時(shí)候把后面的名字作為一個(gè)類來處理刻炒。
@class的作用
- 聲明一個(gè)類决采,告訴編譯器某個(gè)名稱是一個(gè)類
開發(fā)中引用一個(gè)類的規(guī)范
在.h文件中使用@class來聲明類
在.m文件中真正要使用到的時(shí)候,使用#import來包含類中的所有東西
兩端循環(huán)引用的解決方法
一端使用retain,一端使用assign(使用assign的在dealloc方法中也不用再release)
(六)ARC內(nèi)存管理原理
-
ARC判斷準(zhǔn)則
只要沒有強(qiáng)指針指向?qū)ο蠓匕拢搶ο缶蜁?huì)被釋放树瞭!另外要強(qiáng)調(diào)的是由編譯器來檢測。 -
指針分類
強(qiáng)指針:默認(rèn)的情況下所有對象創(chuàng)建的指針都是強(qiáng)指針爱谁,__strong關(guān)鍵字表示晒喷,在修飾property屬性中相當(dāng)于retain(適用于oc對象類型)!
弱指針:__weak關(guān)鍵字表示访敌,當(dāng)對象被回收的時(shí)候__weak會(huì)被清空nil凉敲,不然會(huì)有野指針錯(cuò)誤,這是系統(tǒng)幫忙做好的寺旺。在修飾property屬性中相當(dāng)于assign(適用于oc對象類型)爷抓。 -
注意事項(xiàng)
讓程序兼容ARC和非ARC部分。轉(zhuǎn)變?yōu)榉茿RC -fno-objc-arc 轉(zhuǎn)變?yōu)锳RC的阻塑, -f-objc-arc 蓝撇。
ARC也需要考慮循環(huán)引用問題:一端使用strong,另一端使用weak陈莽。
assign:修飾基本數(shù)據(jù)類型渤昌,不適用于oc對象。