OC筆記 - 手動內存管理的基本概念(2015.1.30)

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方法時不自動進行聲明。






發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章