OC的內(nèi)存管理機(jī)制是什么?
答:內(nèi)存管理的機(jī)制:
每個(gè)對(duì)象都有自己的引用計(jì)數(shù)器
在MRC內(nèi)存管理模式下,引用計(jì)數(shù)器計(jì)算機(jī)是無法自動(dòng)操作的。
當(dāng)向?qū)ο蟀l(fā)送alloc、copy、new消息的時(shí)候,該對(duì)象引用計(jì)數(shù)器會(huì)自動(dòng)設(shè)置為1。
向?qū)ο蟀l(fā)送[對(duì)象?? retainCount]獲得該對(duì)象引用計(jì)數(shù)器的值。
當(dāng)不在使用對(duì)象的時(shí)候,會(huì)發(fā)送release消息,通知引用計(jì)數(shù)器”減“1.
當(dāng)一個(gè)對(duì)象的引用計(jì)數(shù)器的值為0時(shí),”系統(tǒng)“會(huì)自動(dòng)銷毀該對(duì)象,并回收該內(nèi)存空間。
當(dāng)對(duì)象銷毀的時(shí)候,會(huì)自動(dòng)發(fā)送dealloc消息。
聲明式屬性中是如何解決內(nèi)存問題的?
答:
默認(rèn)情況下聲明式屬性,并沒有解決內(nèi)存問題
如果需要解決內(nèi)存問題,需要加上(retain)
-(void)setBook:(Book*)book
{
????? if(nil ==_book)
???? {
??????????? _book =book;
??????????? [_book retain];
????? }else{
?????????? [_book release];
?????????? _book = book;
?????????? [_book retain];
????? }
}
-(void) dealloc{
????????? [_book? release];
????????? [super? dealloc];
}
@property (retain) Book* book;
聲明式屬性解決的只有setter問題,加1操作問題
dealloc中減1操作依然需要自己做
如果一個(gè)對(duì)象中的聲明式屬性是對(duì)象類型,加上retain
當(dāng)一個(gè)對(duì)象銷毀的時(shí)候,應(yīng)該將它擁有的屬性對(duì)象全部release(重寫dealloc方法)
getter方法和工廠方法中的內(nèi)存問題是如何解決的?
答:自動(dòng)釋放池可以幫我們自動(dòng)釋放對(duì)象
+(id)EFstudent{
??? EFStudent* stu = [Student alloc] init] autorelease];
???? return stu;
}
-(EFStudent*)student{
????? return?? [[_student? retain] autorelease];
內(nèi)存的管理,是對(duì)堆內(nèi)存的管理(申請(qǐng)和釋放)通過引用計(jì)數(shù)器來管理,當(dāng)引用計(jì)數(shù)器為0時(shí),系統(tǒng)釋放那片內(nèi)存。MRC模式下,內(nèi)存的管理要遵循誰申請(qǐng),誰釋放的原則,即誰把引用計(jì)數(shù)器加1,誰負(fù)責(zé)減1,內(nèi)存管理不當(dāng)?shù)暮蠊?,程序崩潰(使用釋放的?duì)象)和內(nèi)存泄露。