1.手動內存管理基本概念
創建對象
1.分配內存空間,存儲對象
2.初始化成員變量
3.反回對象的指針地址
1.對象在完成創建的同時,內部會自動創建一個引用計數器,這個計數器,是系統用來判斷是否回收對象的唯一依據,當我們的引用計數retainCount = 0的時候,系統會毫不猶豫回收當前對象
2.[對象 release] reatinCount - 1
3.[對象 retain] reatinCount + 1 ,返回self
4.我們的引用計數retainCount = 0的 對象就被銷燬了
5.dealloc函數,當一個對象要被銷燬的時候,系統會自動調用dealloc函數,通知對象你將要被銷燬
內存管理原則(配對原則):只要出現了 new,alloc,retain,就一定配對出現一個release,autorelease
<span style="font-size:18px;">-(void)dealloc
{
//在對象自身被銷燬之前,一定要先調用[super dealloc]釋放父類中的相關對象
[super dealloc];
NSLog(@"Person 被銷燬了");
}
</span>
2.單個對象的內存管理分析
手動內存管理研究問題方法
1.野指針操作
2.內存泄漏
retainCount= 0
系統已經將p所指向的對象回收了
EXC_BAD_ACCESS 訪問了不可訪問的內存空間
被系統回收的對象我們稱之爲殭屍對象
默認情況下xcode爲了提高編碼效率,不會時時檢查殭屍對象
如果你確定當前作用於中的對象已經不會再被使用了,爲了防止野指針操作,通常我們會把不在使用的指針變量賦值爲nil
只要對象的retainCount != 0就會一直存在在內存中
內存泄漏指的就是,不再被使用的對象,一直在內存中沒有被銷燬
野指針操作,當一個對象retainCount已經爲0 時,調用retain方法,是不會使得對象起死回生的,同時還會發生野指針操作異常
4.set方法的內存管理分析
<span style="font-size:18px;">- (void)setCar:(Car *)car
{
if (_car != car) //判斷是否爲原來的對象,若是則無需“去舊換新”
{ //c1 0
//relese舊值
[_car release];//[nil release];
//c2 2
//retain新值
_car = [car retain];
}
</span>
5.@property參數
1.生產get與set方法的聲明
2.生成get與set方法的簡單實現
3.若果你沒有聲成名相對象的成員變量,那麼他會自動生成一個_開頭的成員變量
@property 參數分爲4類
1.與set方法內存管理相關參數
retain: 要生成符合內存管理原則的set方法(應用與對象類型)
assign: 直接賦值,(對象類型,基本數據類型)
copy : (後面講解)
2.多線程相關
nonatomic: 不生成多線程線管代碼,使用這個就可以了(效率高一點)
atomic:生成多線程線管代碼(不寫默認是這種方式)
實際開發中,只要是對象類型的@property都寫成下面
3.是否要生成set與get方法
readwrite: 可讀可寫屬性,同時生成set與get方法
readonly : 只讀屬性,只生成get方法
4.set與get方法名稱相關的參數
setter:設置生成的set方法名稱
getter:設置生成的get方法名稱
如果一個對象被生成成了成員變量或者是使用@property生成的符合內存管理的set方法,那麼一定要在 dealloc函數對應一次release操作
注意:@property會自動聲明帶下劃線的變量,但當同時重寫setter和getter方法時不自動進行聲明。