iOS記憶體管理,ios記憶體管理機制

來源:互聯網
上載者:User

iOS記憶體管理,ios記憶體管理機制

記憶體管理就是確保開闢的堆空間被正確的釋放。如果堆空間沒有釋放,稱為【記憶體泄露】使用已經釋放的空間,稱為【提前釋放】重複釋放同一個空間,稱為【重複釋放】

(1)當我們要釋放一個堆,首先要確定使用這個堆的指標,都訪問完畢。避免提前釋放。

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

(3)模組化操作,哪個模組負責釋放,將成為巨大的難題。

(4)多線程操作,無法確定哪個線程最後使用完畢。

【結論】OC的記憶體管理,就是在編寫程式時,保證計數器的數值和使用對象指標數相同,保證計數的增加和減少次數相同。

【手動記憶體管理MRC】

一.關閉ARC

//工程 —> Targets —> BuildSetting —> 搜尋【gar】

【YES】—>【NO】

NSObject:

- (id)retain;//引用計數加1

- (void)release;//引用計數減1 理論上減到0釋放,原則上一個指標只能發送該訊息一次

- (NSUInteger)retainCount;

//返回對象的當前引用計數

Δ二.記憶體管理的法則

1.凡是用alloc,retain,new(或使用new開頭的方法),copy(或使用copy開頭的方法),mutableCopy(或使用mutableCopy開頭的方法)【建立】的對象,都必須使用release或autorelease方法【釋放】

Δ2.誰建立誰釋放(哪個類建立,哪個類釋放;誰寫alloc,誰寫release)。

【注意事項】

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

2.注意指標的轉移 釋放舊對象 保留新對象。

3.從資料結構如數組中取出對象地址,如果需要長時間使用,應當retain。

【相關方法】

copy 和 mutableCopy:只用來複製字串

new

[Dog new] <==> [[Dog alloc] init];

三.自動釋放池

@autoreleasepool{

@autoreleasepool{

}

}

NSAutoreleasePool

//自動釋放池原本也是對象,為了配合ARC改成了關鍵字。

- (id)autorelease;

//自動釋放/ 延遲釋放

【注】自動釋放池類似一個數組,進行延遲釋放,不會馬上計數器減1,而是將當前對象,放入最近的自動釋放池。當池釋放時,將每個池中的元素釋放一次。

【注】在iOS程式中,每個觸發周期,都會建立並銷毀一個自動釋放池。

【自動釋放原則】

1.方法的局部變數可以使用自動釋放。

2.非用自動釋放不可的情況

【結論】只有一個函數中使用的對象,可以使用類方法建立。

四.相關工具

product —> profile —> leaks

【自動記憶體管理ARC】

//從Xcode5以後,預設自動記憶體管理

automatic reference counting;

//自動引用計數

【提】簡單點說就是讓編譯器完成堆空間的引用計數加減,自動釋放。程式員不再寫 retain release等方法

【另】OC的自動記憶體管理,不同於JAVA記憶體回收。而是在預先處理時,直接在應該保留的地方,添加retain,在應該釋放的地方,添加release。是直接添加代碼。

【另】從效率上,ARC優於手動記憶體管理。

一.ARC的局限

1.使用ARC,可能因為代碼的不規範,導致記憶體提前釋放。

//尤其使用AVAudioplayer類的時候,很可能造成提前釋放。

2.匯入一些第三方庫,或者匯入舊代碼,這些代碼不支援ARC。

二.解決ARC的局限

1.將不使用ARC的代碼轉成ARC代碼

Edit —> Refactor —> Convert to ARC

2.ARC非ARC混編

//同一個工程中,部分檔案使用ARC,部分檔案不使用ARC。

Build phase -----> Complie Source

-fno-objc-arc

三.使用ARC的技巧

1.四個關鍵字 修飾引用

__strong(強引用) 預設屬性,其修飾的對象指標,指向哪個對象,會對該對象retain,離開哪個對象,會對該對象release。

__weak(弱引用)其修飾的對象指標,指向任何對象都不會retain。這樣的指標指向的對象隨時可能消失。如果對象消失了,這個指標會自動變成nil。

//在iOS編程中,代理對象使用弱引用。

__unsafe_unretained 其修飾的對象指標,指向任何對象都不retain。當指向的對象消失,該指標不會變成nil,仍然指向已經釋放的對象

__autoreleasing 只用來修飾需要被傳入地址的指標。如:

__autoreleasing NSError * error;   &error;

2.屬性的()參數,原則上,不能寫retain copy了,只能寫Strong,如果不想retain,寫Weak

【注】但實際上ARC對這方面很寬鬆,謝了retain也沒關係。

3.id 指向對象,不能用void * p指向對象。

int a;

void * p = &a;

id p = [[NSObject alloc] init];

4.C的結構體中,不能聲明對象指標。否則這個指標不會進行記憶體管理

struct sct{

id obj;

};

5.不能(顯式)手動調用父類的dealloc

-(void)dealloc

{

self.name = nil;

//自動調用父類的dealloc

}

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.