ARC
- 自動(dòng)引用計(jì)數(shù)(Autotic Reference Counting) 是指內(nèi)存管理中對(duì)引用采用自動(dòng)計(jì)數(shù)的技術(shù)。
在OC中采用ARC機(jī)制址貌,通過(guò)編譯器來(lái)管理(注意:ARC不是OC語(yǔ)法)
內(nèi)存管理的思考方式
- 自己生成的對(duì)象自己持有练对,
- 非自己生成的對(duì)象,自己也能持有
- 不再需要自己持有的對(duì)象時(shí)釋放
- 非自己持有的對(duì)象無(wú)法釋放
自己生成的對(duì)象自己持有
使用allloc/new/copy/mutableCopy開頭的方法名以為著自己生成的對(duì)象自己持有
copy和mutableCopy要注意實(shí)現(xiàn)相應(yīng)的NSCopying和NSMutableCopying協(xié)議以及其方法
非自己生成的對(duì)象虚青,自己也能持有
通過(guò)return方法棒厘,或者NSMutableArray類的array方法
不再需要自己持有的對(duì)象時(shí)釋放
自己持有的對(duì)象一旦不需要奢人,自己有義務(wù)釋放,使用release
- 在OC對(duì)象存有引用計(jì)數(shù)這一整數(shù)值
- 在調(diào)用alloc或者retain后何乎,引用計(jì)數(shù)值加一
- 調(diào)用release后宪赶,引用計(jì)數(shù)值減一
- 當(dāng)引用計(jì)數(shù)值為1后搂妻,繼續(xù)調(diào)用release,系統(tǒng)調(diào)用dealloc方法飛起對(duì)象(這時(shí)的引用計(jì)數(shù)值不一定為0欲主,已經(jīng)知道要釋放了就沒(méi)必要減一了)
- 在蘋果中扁瓢,對(duì)象用內(nèi)存塊的分配引几,無(wú)需考慮內(nèi)存塊頭部
- 引用計(jì)數(shù)表中存有各內(nèi)存塊地址,可以從各個(gè)記錄追述到各個(gè)內(nèi)存塊地址
autorelease
自動(dòng)釋放敞掘,類似于C語(yǔ)言中的自動(dòng)變量(局部變量)的特性
autorelease的使用方法
- 生成并持有NSAutoreleasePool對(duì)象
- 調(diào)用已分配對(duì)象的autorelease方法
- 廢棄NSAutoreleasePool對(duì)象后楣铁,所有加入所有調(diào)用過(guò)autorelease方法的對(duì)象盖腕,都會(huì)執(zhí)行release方法
ARC規(guī)則
所有權(quán)修飾符
strong/weak/autoreleaseing/unsafe_unretained
- strong會(huì)使引用計(jì)數(shù)+1 隨著變量在超出作用域后被放棄,并自動(dòng)調(diào)用廢棄方法
- weak不會(huì)增加引用計(jì)數(shù)劲厌,在持有某對(duì)象的弱引用時(shí)脊僚,若對(duì)象被廢棄,則此弱引用將自動(dòng)失效且處于nil被賦值的狀態(tài)增淹。
使用weak可以防止循環(huán)引用 - unsafe_unretained和weak很像虑润,但是不會(huì)將失效的對(duì)象賦值nil
ARC規(guī)則
- 不能使用retain/release/retainCount/autorelease
- 不能使用NSAllocateObject/NSDeallocateObject
- 必須遵守內(nèi)存管理的方法的命名規(guī)則
- 不要顯式調(diào)用dealloc
- 使用@autoreleasepool塊代替NSAutoreleasePool對(duì)象
- 不能使用區(qū)域(NSZone)
- 對(duì)象型變量不能作為C語(yǔ)言結(jié)構(gòu)體的成員
- 顯示轉(zhuǎn)換id 和 void*(使用__bridge)