- MRC:manual reference counting 手動(dòng)內(nèi)存管理
- ARC:automatic reference counting 自動(dòng)內(nèi)存管理
MRC管理內(nèi)存
1、基本概念
MRC:手動(dòng)內(nèi)存管理
alloc、retain、copy、new 會(huì)造成引用計(jì)數(shù)加1 ;與release 成對(duì)出現(xiàn)
內(nèi)存的擁有者:造成引用計(jì)數(shù)加1的對(duì)象
誰(shuí)擁有,誰(shuí)釋放
2、局部、全局變量
局部變量:出作用域之前,要記得release
全局變量:在dealloc方法中release
dealloc方法:是當(dāng)前類的引用計(jì)數(shù)為 0 的時(shí)候,會(huì)調(diào)用的方法
[super dealloc]是dealloc方法的最后一句代碼
3、靜態(tài)方法
局部變量:不需要進(jìn)行內(nèi)存管理;
全局變量:需要retain;在dealloc方法中release;
4、賦新值之前,釋放舊值
1)對(duì)象類型:(除了 NSString、delegate )retain
2)NSString:copy
3)基本類型、delegate :assign
delegate:采用關(guān)鍵字 assign是為了避免 循環(huán)引用
定時(shí)器、字符串 不符合內(nèi)存管理
ARC管理內(nèi)存
- 如果在ARC工程中,使用了非ARC(MRC)文件,需要添加 -fno-objc-arc 標(biāo)簽
- 如果在非ARC工程中,使用了ARC的文件,需要添加 -fobjc-arc 標(biāo)簽
ARC 編譯器的特性:編譯器在 編譯時(shí) ,會(huì)在合適的位置添加上 retain 、release 等操作
( ps:GC (java語(yǔ)言中)garbage collection 垃圾回收機(jī)制 運(yùn)行時(shí) )
-
strong強(qiáng)引用:強(qiáng)引用指向的對(duì)象,會(huì)保留對(duì)象的所有權(quán),對(duì)象不會(huì)馬上釋放,如果對(duì)象沒(méi)有strong類型的強(qiáng)引用指針時(shí),對(duì)象馬上就會(huì)被釋放掉
-
weak弱引用:弱引用指向的對(duì)象如果被釋放了,指針會(huì)置為空 nil
-
當(dāng)創(chuàng)建的變量沒(méi)有關(guān)鍵字 默認(rèn)是strong
-
-(void)dealloc-
對(duì)象將要釋放,但在 未釋放之前 執(zhí)行dealloc方法
-
在ARC中dealloc方法還會(huì)執(zhí)行,但不需要寫(xiě)
[super dealloc]語(yǔ)句
可以在dealloc方法中移除通知、移除KVO
-
-
局部變量:在當(dāng)前方法執(zhí)行完畢時(shí),對(duì)象會(huì)被釋放
-
全局變量:當(dāng)前視圖控制器釋放,會(huì)被釋放,或者它的指針置為空nil
-
基本類型(int...): 一般使用 unsafe_unretained 編譯時(shí),會(huì)將 assign 改成 unsafe_unretained
-
非基本類型的變量一般使用 strong
retain 在編譯時(shí),會(huì)將retain改成為strong -
copy和MRC中的使用一致
-
weak:outlet 中一般使用 weak (父視圖會(huì)對(duì)此控件強(qiáng)引用)
-
循環(huán)引用:把其中一個(gè)strong類型的指針改成weak
-
autorelease 在ARC中可以使用:__autoreleasing
-
NSAutoreleasePool 自動(dòng)釋放池(MRC中使用)
-
在局部創(chuàng)建大量對(duì)象,需要把對(duì)象放入到自動(dòng)釋放池中 ( ARC中)
@autoreleasepool
{}
C 語(yǔ)言的處理
ARC 只負(fù)責(zé) OC
void * (c語(yǔ)言中的任意類型)
從OC類型轉(zhuǎn)換成 c語(yǔ)言類型
-
__bridge 關(guān)鍵字 可以在oc與c之間相互轉(zhuǎn)換
-
__bridge 只是做了一個(gè)類型轉(zhuǎn)換,與內(nèi)存管理無(wú)關(guān)
- __bridge 可以在oc和c之間任意轉(zhuǎn)換,與內(nèi)存管理無(wú)關(guān)
- __bridge_retained oc ===> c 轉(zhuǎn)換了對(duì)象 的所有權(quán) 需要使用CFRetain 、CFRelease來(lái)管理內(nèi)存
- __bridge_transfer c ===> oc 轉(zhuǎn)換了對(duì)象的所有權(quán)
copy的處理
- 深復(fù)制:對(duì)象復(fù)制 返回新的對(duì)象
- 淺復(fù)制:指針復(fù)制 返回的是復(fù)制的指針
NSString 能使用copy 關(guān)鍵字,實(shí)現(xiàn)了NSCopying 協(xié)議
只有實(shí)現(xiàn)了 NSCopying協(xié)議 和 NSMutableCopying協(xié)議的對(duì)象才能使用 copy和mutableCopy 關(guān)鍵字
copy : 返回的是不可變對(duì)象
mutableCopy : 返回的是可變對(duì)象
對(duì)于 NSString copy 就是淺 copy 只是復(fù)制了指針 (指針指向的是同一個(gè)對(duì)象)
對(duì)于NSMutableString 無(wú)論是copy 還是mutableCopy 都是深copy ,copy了對(duì)象(創(chuàng)建了新的對(duì)象)
深copy又分為:
- 不完全copy :只把對(duì)象copy了一份,屬性沒(méi)有copy
- 完全copy:把對(duì)象copy了一份,并且把對(duì)象中的所有屬性都copy一份
微信公共號(hào):iapp666666
GitHub:點(diǎn)此前往