1贞言、簡(jiǎn)述內(nèi)存管理基本原則
之前:OC內(nèi)存管理遵循“誰創(chuàng)建斜棚,誰釋放,誰引用蜗字,誰管理”的機(jī)制打肝,當(dāng)創(chuàng)建或引用一個(gè)對(duì)象的時(shí)候脂新,需要向她發(fā)送alloc挪捕、copy、retain消息争便,當(dāng)釋放該對(duì)象時(shí)需要發(fā)送release消息级零,當(dāng)對(duì)象引用計(jì)數(shù)為0時(shí),系統(tǒng)將釋放該對(duì)象滞乙,這是OC的手動(dòng)管理機(jī)制(MRC)奏纪。
目前:iOS 5.0之后引用自動(dòng)管理機(jī)制——自動(dòng)引用計(jì)數(shù)(ARC),管理機(jī)制與手動(dòng)機(jī)制一樣斩启,只是不再需要調(diào)用retain序调、release、autorelease兔簇;它編譯時(shí)的特性发绢,當(dāng)你使用ARC時(shí)硬耍,在適當(dāng)位置插入release和autorelease;它引用strong和weak關(guān)鍵字边酒,strong修飾的指針變量指向?qū)ο髸r(shí)经柴,當(dāng)指針指向新值或者指針不復(fù)存在,相關(guān)聯(lián)的對(duì)象就會(huì)自動(dòng)釋放墩朦,而weak修飾的指針變量指向?qū)ο笈魅希?dāng)對(duì)象的擁有者指向新值或者不存在時(shí)weak修飾的指針會(huì)自動(dòng)置為nil。
如果使用alloc氓涣、copy(mutableCopy)或者retian一個(gè)對(duì)象時(shí),你就有義務(wù),向它發(fā)送一條release或者autorelease消息牛哺。其他方法創(chuàng)建的對(duì)象,不需要由你來管理內(nèi)存。
向一個(gè)對(duì)象發(fā)送一條autorelease消息,這個(gè)對(duì)象并不會(huì)立即銷毀, 而是將這個(gè)對(duì)象放入了自動(dòng)釋放池,待池子釋放時(shí),它會(huì)向池中每一個(gè)對(duì)象發(fā)送 一條release消息,以此來釋放對(duì)象.
向一個(gè)對(duì)象發(fā)送release消息,并不意味著這個(gè)對(duì)象被銷毀了,而是當(dāng)這個(gè)對(duì)象的引用計(jì)數(shù)為0時(shí),系統(tǒng)才會(huì)調(diào)用dealloc方法,釋放該對(duì)象和對(duì)象本身它所擁有的實(shí)例春哨。
其他注意事項(xiàng)
如果一個(gè)對(duì)象有一個(gè)_strong類型的指針指向著荆隘,找個(gè)對(duì)象就不會(huì)被釋放。如果一個(gè)指針指向超出了它的作用域赴背,就會(huì)被指向nil椰拒。如果一個(gè)指針被指向nil,那么它原來指向的對(duì)象就被釋放了凰荚。當(dāng)一個(gè)視圖控制器被釋放時(shí)燃观,它內(nèi)部的全局指針會(huì)被指向nil。用法“:不管全局變量還是局部變量用_strong描述就行便瑟。
局部變量:出了作用域缆毁,指針會(huì)被置為nil。
方法內(nèi)部創(chuàng)建對(duì)象到涂,外部使用需要添加_autorelease;
連線的時(shí)候脊框,用_weak描述。
代理使用unsafe_unretained就相當(dāng)于assign践啄;
block中為了避免循環(huán)引用問題浇雹,使用_weak描述;
聲明屬性時(shí)屿讽,不要以new開頭昭灵。如果非要以new開頭命名屬性的名字,需要自己定制get方法名伐谈,如
@property(getter=theString) NSString * newString;
如果要使用自動(dòng)釋放池烂完,用@autoreleasepool{}
ARC只能管理Foundation框架的變量,如果程序中把Foundation中的變量強(qiáng)制換成Core Foundation中的變量需要交換管理權(quán)诵棵;
在非ARC工程中采用ARC去編譯某些類:-fobjc-arc抠蚣。
在ARC下的工程采用非ARC去編譯某些類:-fno-fobjc-arc。
2履澳、簡(jiǎn)述#define和const變量有什么區(qū)別?
1嘶窄、#define在預(yù)處理階段進(jìn)行簡(jiǎn)單的替換缓屠,const在編譯階段使用
2、#define不做類型檢查护侮,僅僅展開替換敌完,const有數(shù)據(jù)類型,會(huì)執(zhí)行類型檢查
3羊初、#define不分配內(nèi)存滨溉,僅僅展開替換,const會(huì)分配內(nèi)存
4长赞、#define不能調(diào)試晦攒,const可以調(diào)試
5、#define定義的常量在替換后運(yùn)行過程中會(huì)不斷地占用內(nèi)存得哆,而const定義的常量存儲(chǔ)在數(shù)據(jù)段脯颜,只有一份copy,效率更高
6贩据、#definde可以定義一些簡(jiǎn)單的函數(shù)栋操,const不可以