Objective-C 內存管理和ARC

內存管理多線程

範圍: 任何繼承了NSObject的對象 對基本數據類型無效性能

原理: 每一個對象內部都保存了一個與之相關聯的整數 稱爲引用計數器優化

1.計數器的基本操做atom

當使用alloc new或者copy建立一個對象時 對象的引用計數器被設置爲1spa

retain: 計數器+1 會返回對象自己線程

release: 計數器-1 沒有返回值指針

retainCount: 獲取當前的計數器值code

dealloc: 當一個對象要被回收的時候 就會調用 必定要調用[super dealloc];這句調用要放在最後面對象

殭屍對象: 所佔用內存已經被回收的對象 殭屍對象不能再使用blog

野指針: 指向殭屍對象(不可用內存)的指針 給野指針發送消息報錯(EXC_BAD_ACCESS)

空指針: 沒有指向任何東西的指針(存儲的東西是nil NULL 0) 給空指針發送消息不會報錯

2.內存管理原則

誰建立 誰釋放 若是你經過alloc new或者copy建立一個對象 那麼你必須調用release或autorelease 換句話說 不是你建立的 就不用你去釋放

通常來講 除了alloc new或者copy以外的方法建立的對象都被聲明瞭autorelease

誰retain 誰release 只要你調用了retain 不管這個對象是如何生成的 你都要調用release

規範: 只要調用了alloc 必須有release 或 autorelease

set方法的實現

/** 基本數據類型 直接複製 **/
- (void) setAge : (int) age {
    _age = age;
}

/** OC對象類型 **/
- (void) setCar : (Car *) car {
    //先判斷是否是新傳進來的對象
    if (car != _car) {
        //對舊對象作一次release
        [_car release];
        
        //對新對象作一次retain
        _car = [car retain];
    }
}

dealloc方法的實現

//必定要 [super dealloc]; 並且放到最後面
//對self (當前) 所擁有的對象作一次release
- (void) dealloc {

    [_car release];
    [super dealloc];
}

3.@property參數

@property (參數, 參數 …) int height;

注意同類型的參數不能寫多個

a.set方法內存管理相關的參數

retain: release舊值 retain新值(適用於OC對象類型)

assign: 直接賦值(默認 適用於非OC對象類型) 

copy: release舊值 copy新值

b.是否要生成set方法

readwrite: 同時生成set和get的聲明 實現(默認)

readonly: 只會生成get 聲明 實現

c.多線程管理

nonatomic: 性能高(通常就用這個)

atomic: 性能低(默認)

d.set 和 get 方法的名稱

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

getter = : 決定了get方法的名稱, (通常用在BOOL類型)

4.循環retain和@class

循環retain

好比A對象retain了B對象 B對象retain了A對象

這樣會致使A對象和B對象永遠沒法釋放

解決方案: 當兩端互相引用時 應該一端用retain 一端用assign

@class的做用: 僅僅告訴編譯器 某個名稱是一個類

@class Person; 僅僅告訴編譯器 Person是一個類

在開發中引用一個類的規範

在.h文件中用@class來聲明類

在.m文件中用#import來包含類的全部東西

5.autorelease

int main() {
    @autoreleasepool {// {開始 表明建立了釋放池
        Person *p = [[[Person alloc] init] autorelease];
        p.age = 10;
    }// }結束 表明銷燬了釋放池
    return 0;
}

/** autorelease基本用法 **/
//會將對象放到一個自動釋放池中
//當自動釋放池被銷燬時 會對池子裏的全部對象作一次release操做
//會返回對象自己
//調用完autorelease方法後 對象的計數器值不變

/** autorelease的好處 **/
//不用再關心對象釋放的時間
//不用再關心何時調用release

/** autorelease的使用注意 **/
//佔用內存較大的對象不要隨便使用autorelease
//佔用內存較小的對象使用autorelease沒有太大影響

/** 錯誤寫法 **/
//alloc後調用了autorelease 又調用release
//連續調用屢次autorelease

/** 自動釋放池 **/
//在IOS程序運行過程當中 會建立無數個池子 這些池子都是以棧結構存在(先進後出)
//當一個對象調用autorelease方法時 就將這個對象放到棧頂的釋放池

/** 開發過程當中常常寫一些類方法快速建立一個autorelease的對象 建立對象時不要直接使用類名 用self **/

ARC

1.基本簡介

ARC是自iOS 5以後增長的新特性 徹底消除了手動管理內存的煩瑣 編譯器會自動在適當的地方插入適當的retain release autorelease語句 你再也不須要擔憂內存管理 由於編譯器爲你處理了一切

ARC是編譯器特性 而不是IOS運行時特性 不一樣於其它語言中的垃圾收集器 所以ARC和手動內存管理性能是同樣的 有時還能更加快速 由於編譯器還能夠執行某些優化

2.基本原理

規則: ARC的規則很是簡單 只要還有一個強指針變量指向對象 對象就會保持在內存中

強指針: 默認狀況下 全部的指針都是強指針 __strong

弱指針: 弱指針指向的對象被回收後 弱指針會自動變爲nil指針 不會引起野指針錯誤 __weak

3.使用注意

不能調用release, retain, autorelease, retainCount

能夠重寫dealloc, 可是不能調用[super dealloc];

@property的參數

strong: 成員變量是強指針 (適用於OC對象類型)

weak: 成員變量是弱指針 (適用於OC對象類型)

assign: 適用於非OC對象類型

將不使用ARC時用的retain替換成strong

兩端互相引用時: 一端用strong 一端用weak

關閉整個項目的ARC

關閉某個.m文件的ARC

相關文章
相關標籤/搜索