/*
一內(nèi)存管理
1.
在內(nèi)存之中申請一塊空間用來存儲數(shù)據(jù),聲明一個變量
2.
當(dāng)數(shù)據(jù)不在使用的時候,應(yīng)該將這個數(shù)據(jù)釋放掉
3.
內(nèi)存中的五大區(qū)域棧:作用域結(jié)束,也就是大括號結(jié)束堆:
BSS:
一旦初始化就會被回收,并轉(zhuǎn)到數(shù)據(jù)段常量區(qū):程序結(jié)束被回收代碼段:程序結(jié)束被回收
4.
我們創(chuàng)建的對象是存儲在堆區(qū)的創(chuàng)建在堆區(qū)中的對象肯定是需要被回收的,當(dāng)它不在被使用的時候.就應(yīng)該被回收掉
iOS
系統(tǒng)對每個APP占用內(nèi)存是有極限的要求
40M
會給程序發(fā)送一條警告
45M
還會再次警告你
120M
直接將程序結(jié)束掉
5.
內(nèi)存管理的范圍內(nèi)存中的除堆區(qū)以為的數(shù)據(jù)都是有系統(tǒng)來自動管理的,所以這些區(qū)域的數(shù)據(jù)不需要程序員管理我們需要管理的是堆區(qū)中的數(shù)據(jù),也就是OC對象.也就是從NSObject繼承的子類對象都需要我們來管理重點:當(dāng)堆內(nèi)存中的OC對象不在使用的時候,就應(yīng)該被釋放掉
6.OC
對象的生命周期
1>OC
對象什么時候創(chuàng)建
new,alloc,copy
就會創(chuàng)建一個OC對象.這個時候OC對象就會存儲在堆空間中
2>OC
對象什么時候銷毀當(dāng)這個對象不再使用的時候
7.
對象的擁有者誰在使用這個對象,誰就是這個對象的擁有者.
指針指向一個對象,我們就說這個指針在使用這個對象,這個對象的所有者就是這個指針對象什么時候被釋放?
當(dāng)沒有任何指針指向這個對象的時候,或者沒有任何人在使用這個對象,就應(yīng)該被釋放
8.
對象如何知道有幾個人在用我?
Apple
為每個對象設(shè)計了一個屬性,叫做retainCount引用計數(shù)器這個屬性占據(jù)8個字節(jié),類型unsigned long
1>retainCount
的作用:
用來記錄這個對象正在被多少人使用,也可以理解為有多少個指針在指向找個對象當(dāng)有人使用這個對象的時候,應(yīng)該讓這個對象的引用計數(shù)器+1
當(dāng)有人不再使用這個對象的時候,應(yīng)該讓這個對象的引用計數(shù)器-1
2>OC
對象的銷毀標(biāo)準(zhǔn)
OC
對象的引用計數(shù)器是否為0(不是絕對的)
9.
如何操作對象的引用計數(shù)器呢?
為對象發(fā)送retain消息,對象的引用計數(shù)器就會+1
為對象發(fā)送relase消息,對象的引用計數(shù)器就會-1
為對象發(fā)送retainCount消息.就會得到這個對象的引用計數(shù)器的值
所以,當(dāng)我們要使用這個對象的時候,就應(yīng)該為對象發(fā)送一條retian消息當(dāng)我們不再使用這個對象的時候,就應(yīng)該為對象發(fā)送一條release消息
10.
對象的銷毀在對象銷毀的時候,會自動調(diào)用對象的dealloc方法一般情況下,我們?yōu)榱吮O(jiān)視對象的銷毀我們都會去重寫dealloc方法
11.OC
內(nèi)存管理分類
1>MRC:Manual Reference Counting
手動引用技術(shù),有程序員來記錄對象有多少人使用
Xcode4.2
之前,沒有ARC的,程序員手動管理內(nèi)存
2>ARC:Automatic Reference Counting
自動引用計數(shù),由系統(tǒng)自動幫助我們計算
2011
年WWDC,iOS5發(fā)布的時候出現(xiàn)ARC
3>
為什么要學(xué)習(xí)MRC?
a.
面試必問
b.
有些公司的項目開發(fā)比較早(2011),使用的是MRC.你要維護(hù)
c.
一些公司技術(shù)骨干,總監(jiān)從MRC中成長的.比較看中MRC
認(rèn)為不會MRC的程序員不是好程序員
d.ARC
是基于MRC的,要學(xué)會ARC必須要懂MRC
二MRC開發(fā)
1.2011,Xcode4.2
也就是iOS5以后,apple推出ARC機(jī)制,所以默認(rèn)建立的項目都是ARC的
2.
關(guān)閉ARC機(jī)制
target->all->combined->apple llvm language objective c->objective c automatic reference counting ->
修改為NO
3.
重寫dealloc方法的規(guī)范
1>
在對象被釋放的時候自動調(diào)用,做一些對象回收的事情
2>
在子類的dealloc方法中必須要調(diào)用父類的dealloc方法.并且要放在最后調(diào)用創(chuàng)建子類對象子類對象中有父類的屬性,父類的對象屬性的release是寫在父類的dealloc方法中的,為了能釋放子類繼承自父類的屬性,所以要調(diào)用父類的dealloc方法.
這些特別的事情要在父類的dealloc方法中去做所以為了保證對象被正確回收,所在在子類的dealloc方法中要調(diào)用父類的dealloc
4.
當(dāng)對象被創(chuàng)建的時候,這個時候引用計數(shù)器默認(rèn)為1.
注意:給對象發(fā)送release消息是讓對象的引用計數(shù)-1.不是釋放對象.
三內(nèi)存管理的原則
1.
自在有人使用的時候才發(fā)retain當(dāng)一個人不在使用的時候才發(fā)release
2.
誰創(chuàng)建,誰release
誰retain,誰release
總結(jié):有始有終,有加就有減