Objective-C(記憶體管理)

來源:互聯網
上載者:User

標籤:

引用計數器

每個OC對象都有一個佔4個位元組儲存空間的引用計數器

當使用或建立一個對象時,新對象的引用計數器預設是1 

retain:可以使引用計數器+1

release:可以是引用計數器-1

retainCount:獲得當前的引用計數器的值

當對象被銷毀時,會重寫dealloc方法

-(void)dealloc

{

  // 這句必須放在最後面

  [super dealloc];

}

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

野指標:指向殭屍對象(停用記憶體)的指標

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

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

 

多個物件記憶體管理

1. 當使用(佔用)某個對象就應該讓對象的引用計數器+1

(讓對象做一次retain操作)

2. 當不使用(佔用)某個對象就應該讓對象的引用計數器-1

(讓對象做一次release操作)

3.誰retain,誰release

 

set方法的記憶體管理

記憶體管理代碼規範:

1. 只要調用alloc,必須有release(autorelease),對象不是用alloc產生的,就不要寫release

2.set方法的代碼規範

1》基礎資料型別 (Elementary Data Type):直接賦值

- (void)setAge:(int)age

 { 

    _age = age;

 }

 

 2> OC物件類型

 - (void)setCar:(Car *)car

 {

    // 1.先判斷是不是新傳進來對象

    if ( car != _car )

    {

        // 2.對舊對象做一次release

        [_car release];

 

        // 3.對新對象做一次retain

        _car = [car retain];

    }

 }

 

 3.dealloc方法的代碼規範

 1> 一定要[super dealloc],而且放到最後面

 2> 對self(當前)所擁有的其他對象做一次release

 - (void)dealloc

 {

    [_car release];

    [super dealloc];

 }

 

 1.set方法記憶體管理相關的參數

 * retain : release舊值,retain新值(適用於OC物件類型)

 * assign : 直接賦值(預設,適用於非OC物件類型)

 * copy   : release舊值,copy新值

 

 2.是否要產生set方法

 * readwrite : 同時產生setter和getter的聲明、實現(預設)

 * readonly  : 只會產生getter的聲明、實現

 

 3.多線程管理

 * nonatomic : 效能高 (一般就用這個)

 * atomic : 效能低(預設)

 

 4.setter和getter方法的名稱

 * setter : 決定了set方法的名稱,一定要有個冒號 :

 * getter : 決定了get方法的名稱(一般用在BOOL類型)

 

@property 參數

OC物件類型:

@property (nonatomic, retain) 類名 *屬性名稱;

@property (nonatomic, retain) Car *car;

@property (nonatomic, retain) id *car;

非OC物件類型

@property (nonatomic, assign) 類型名稱 屬性名稱;

@property (nonatomic, assign) int age;

 

@class Person;

 @class的作用:告訴編譯器,Person是一個類

開發中引用一個類的規範

1. 在.h檔案中用@class來聲明類

2. 在.m檔案中用#import來包含類的所有東西

 

兩端循環參考解決方案:

1》一端用retain

2》一端用assigh

 

autorelease

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

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

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

2. autorelease會把對象放到一個自動釋放池

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

iOS 5.0 開始如下建立釋放池:

@autoreleasepool

{// {大括弧開始時就建立來自動釋放池

 

} // }大括弧結束代表銷毀釋放池

autorelease的使用注意:

1. 佔用記憶體較大的對象不要使用autorelease

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

 

系統內建的方法裡沒有包含alloc、new、copy,說明返回的對象都是autorelease的

NSString:NS是首碼,Next Step 

開發中經常會提供一些類方法,快速建立一個已經autorelease過的對象

 

例:

+ (id)Person

{

    // 建立對象時不要直接用類名,一般用self

  return [[[self alloc] init] autorelease];

}

 

ARC

Automatic Reference Counting

 ARC的判斷準則:只要沒有強指標指向對象,就會釋放對象

 1.ARC特點

 1> 不允許調用release、retain、retainCount

 2> 允許重寫dealloc,但是不允許調用[super dealloc]

 3> @property的參數

  * strong :成員變數是強指標(適用於OC物件類型)

  * weak :成員變數是弱指標(適用於OC物件類型)

  * assign : 適用於非OC物件類型

 4> 以前的retain改為用strong

 

 指標分2種:

 1> 強指標:預設情況下,所有的指標都是強指標 __strong

 2> 弱指標:__weak

錯誤寫法(沒有意義的寫法):

    __weak Person *p = [[Person alloc] init];

 

當兩端循環參考的時候,解決方案:

 1> ARC

 1端用strong,另1端用weak

 

 2> 非ARC

 1端用retain,另1端用assign

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.