iOS開發之oc(十一)--內存管理MRC

手動內存管理--MRC數組

掌握內容網絡

>理解內存管理的原理數據結構

>掌握手動內存管理MRC多線程

>掌握內存管理在實際工程中的使用app

(一)模塊化

1.理解部分函數

1.1內存管理 (傳統內存管理demo)ui

1.1.1內存管理作了一件什麼事?spa

內存管理就是確保開闢的堆空間獲得正確的釋放線程

若是堆空間沒有釋放,稱爲內存泄露

使用已釋放的堆空間,稱爲提早釋放

重複釋放同一個空間,稱爲重複釋放

 

1.1.2傳統內存管理的困境

(1)當咱們要釋放一個堆,首先要肯定使用這個堆的指針,都訪問完畢,避免提早釋放。

(2)釋放指針指向的堆空間,首先要肯定那些指針指向同一個堆,這些指針,只能釋放一次,避免重複釋放。

(3)模塊化操做,那個模塊負責釋放,將成爲最大的難題

(4)多線程的操做,不卻定那個線程最後使用完畢

 

  1.1.3 困境的解決方法

【引用計數器】

  引用計數簡稱計數器,某一個指針指向了一個對象,引用計數加1,減小一個指針指向對象,引用計數減1,當引用計數爲0的時候,由系統自動釋放該對象佔用的空間(模擬多人網絡遊戲,鬥地主、QQ堂)

  新創建一個對象,系統會自動給該對象添加一個引用計數(retaincount)的屬性

1.1.4 內存管理的黃金法則

1,凡是用alloc,retain,new(或者以new開頭的方法),copy(或者copy開頭的方法),mutableCopy(或者muTableCopy開頭的方法)建立的對象,都須要用release或者autorelease釋放。

2,誰建立誰釋放(個類建立,個類釋放,誰寫alloc,誰寫release)

 

1.1.5 如何將工程改成MRC

                          1點擊工程-》build settings->經過gar關鍵字的搜索搜出Automatic Re..Cou.. 

                             ->將此選項的設置改稱NO

 

1.2.1 alloc與release

alloc建立對象的過程,同時會將對象引用計數0加1,變成1

retain使對象引用計數器加1

release 會使對象引用次數減1

 

1.2.2析構函數

- (void)dealloc方法的注意事項

dealloc,稱爲析構函數,調用順序和構造函數相反,通常狀況下會在該函數中作一些釋放內存工做

  是在引用計數減爲0時纔會被調用(能夠用來驗證對象是否被釋放)

語法:

  

-(void)dealloc
{
    // 注意內部代碼順序

//1.全部成員對象調用一遍release

//[super dealloc] 要寫到dealloc的自後一行,[super dealloc]是真正釋放當前的對象
    
[super dealloc];

}

 

 

     

1.2.3 類的複合中使用

retain 和assign(編譯器特性)

retain 展開

-(void)setDog:(Dog *)dog

{
    if (_dog!=dog) {
        [_dog release];
        _dog=[dog retain];
    }
}

assign展開 

-(void)setDog:(Dog *)dog

{
    _dog=dog;
}

1.2.3 autorelease與autoreleasepool

autoreleasepool 自動釋放池,管理池子中的對象

autorelease,給對象發送autorelease消息時,會將對象存入autoreleasepool,當系統執行完自動釋放池時,自動釋放池會自動清空池子裏邊的對象

【注】自動釋放池相似於一個數組,進行延遲釋放,不會立刻計數器減一,而是將當前對象放入最近的自動釋放池中,當釋放池釋放的時候將池中每個元素都釋放一次

    +方法的內存管理 

 

 +(Student*)create

{
    Student *student=[[[Student alloc]init]autorelease];
//    [student autorelease];
    return student;
}

 

【注意事項】

1,對象的成員變量在構造方法中建立,應該在析構函數中釋放

2,注意指針的轉移,釋放舊對象,保留新對象

3,從數據結構中如數組中讀取出對象地址,若是須要長時間使用應當retain

 

1.2.4 字符串內存管理

 1.2.4.1 字符串的內存管理

1>@「」建立出來的字符串在只讀數據段,是隻讀的,引用計數爲-1,默認的是autorelease對象不能給它發 送retainCount++ 或 retainCount - - 的消息

2>alloc retain copy mutablecopy new建立出的字符串均須要release

3>類方法建立出的字符串和直接賦值的字符串,不須要手動管理內存

1.2.4.2 copy和mutableCopy(只用來複制字符串)

 

1>copy發消息,可變和不可變字符串均轉換成不可變字符串

NSMutableString *mulStr=[[NSMutableString alloc]initWithString:@"abc"];

        NSString *str=@"a";

        NSMutableString *mulStr2=[mulStr copy];

        [mulStr2 appendString:@"aa"];

 

          

2>mutableCopy,不管是可變仍是不可變字符串,都將轉換可變字符串

        

NSMutableString *mulString=[[NSMutableString alloc]initWithString:@"abc"];

        NSString *str=@"ab";

        NSMutableString* mulStr=  [str mutableCopy];

         [mulString appendString:@"ab"];

 

1.2.5 數組的內存管理

1>在可變數組中,經過添加和刪除對象,都可以對該對象的引用計數加1和減1

2>在不可變數組中初始化時,初始化的對象的引用計數會加1,當該數組銷燬的時候(release),數組會給初始化的對象的引用計數減1

相關文章
相關標籤/搜索