黑馬程式員_ Objective-c 記憶體管理筆記

來源:互聯網
上載者:User

標籤:style   blog   http   color   io   os   ar   使用   strong   

引用計數器

 

當一個對象被建立出來,就要分配給記憶體這個對象,當不用這個對象的時候,就要及時的回收,為了可以明確知道對象有沒有被使用,就要用引用計數器來體現,只要計數器不為0,表明對象被使用中。

 

1.方法的基本使用

 1> retain :計數器+1,會返回對象本身

 2> release :計數器-1,沒有傳回值

 3> retainCount :擷取當前的計數器

 4> dealloc

  * 當一個對象要被回收的時候,就會調用

  * 一定要調用[super dealloc],這句調用要放在最後面

 

2.概念

 1> 殭屍對象 :所佔用記憶體已經被回收的對象,殭屍對象不能再使用

 2> 野指標 :指向殭屍對象(不可用記憶體)的指標,給野指標發送訊息會報錯(EXC_BAD_ACCESS)

 3> null 指標 :沒有指向任何東西的指標(儲存的東西是nil、NULL、0),給null 指標發送訊息不會報錯

 

常見錯誤:

 

EXC_BAD_ACCESS : 訪問了一塊壞的記憶體(已經被回收、已經停用記憶體

 

-[Person setAge:]: message sent to deallocated instance 0x100109a10

給已經釋放的對象發送了一條-setAge:訊息

 

set方法記憶體管理

 

如果一個指標指向一個新建立出來的對象,對象的計數器會加1,當指標又指向了一個新的對象的時候,原來的對象佔用的記憶體就應該要及時的釋放,這個時候就需要對set方法重寫,對對象的計數器做一次管理

- (void)setCar:(Car *)car{    if (car != _car)    {        // 對當前正在使用的車(舊車)做一次release        [_car release];                // 對新車做一次retain操作        _car = [car retain];    }}

 

 

說明:基礎資料型別 (Elementary Data Type)不需要管理記憶體

 

在對象被回收的時候會自動調用dealloc方法

 

 

- (void)dealloc {    [_car release];    [super dealloc]; }

 

 

記憶體管理代碼規範:

只要調用了alloc,copy,必須有release(autorelease)

對象不是通過alloc或者copy產生的,就不需要release

 

 

autorelease和autoreleasePool

 

 

1.autorelease的基本用法

 1> 會將對象放到一個自動釋放池中

 2> 當自動釋放池被銷毀時,會對池子裡面的所有對象做一次release操作

 3> 會返回對象本身

 4> 調用完autorelease方法後,對象的計數器不變

 

 2.autorelease的好處

 1> 不用再關心對象釋放的時間

 2> 不用再關心什麼時候調用release

 

 3.autorelease的使用注意

 1> 佔用記憶體較大的對象不要隨便使用autorelease

 2> 佔用記憶體較小的對象使用autorelease,沒有太大影響

 

 

 4.錯誤寫法

 1> alloc之後調用了autorelease,又調用release

 @autoreleasepool {    // 1    Person *p = [[[Person alloc] init] autorelease];     // 0    [p release]; }

 

 

 2> 連續調用多次autorelease

 

@autoreleasepool {    Person *p = [[[[Person alloc] init] autorelease] autorelease]; }

 

 

 5.自動釋放池

 1> 在iOS程式運行過程中,會建立無數個池子。這些池子都是以棧結構存在(先進後出)

 2> 當一個對象調用autorelease方法時,會將這個對象放到棧頂的釋放池

 

說明:

1.autorelease方法會返回對象本身

2.調用完autorelease方法後,對象的計數器不變

3.autorelease會將對象放到一個自動釋放池中

4.當自動釋放池被銷毀時,會對池子裡面的所有對象做一次release操作

黑馬程式員_ Objective-c 記憶體管理筆記

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.