1. 程式人生 > >iOS----MRC(手動內存管理)

iOS----MRC(手動內存管理)

init 賦值 new 系統 return 通過 空指針 span 但是

1.MRC是什麽,有什麽用?

在蘋果開發中,我們是沒有垃圾回收機制的。所以在ARC推出之前,我們蘋果開發程序員需要通過手動代碼的形式盡量嚴密的管理我們的App的內存;

--------------------------------------------------------------------------------------------------------------------------------------------------------------

2.如何運用MRC管理內存?

      1)實際關鍵字:

無論是ARC還是MRC管理內存都涉及到幾個關鍵字符:

使用alloc、new、copy創建一個對象,該對象的retain count 都等於1,需要用release來釋放該對象。誰創建,誰去釋放。在這3鐘方法以外的方法創建的對象,都被系統默認的聲明為autorelease。

ClassA *a = [[ClassA alloc] init];

ClassA *b = a;

[b retain];

//do smoething

[b release];

b = nil;

把 一個指針賦值給另外一個指針的時候,a 指針所指向的對象的引用次數並沒有增加,也就是說,對象的retain count依然等於1。只有在retain了之後,retain count 才會加1。那麽,如果這時候執行[a release],只是a指針放棄了對對象的訪問權,對象的retain count 減1,對象沒有被銷毀。只有當b也執行了release方法之後,才會將對象銷毀掉。因此,誰retain了,誰就要release。

在對象被銷毀之後,指針依然是存在的。所以在release了之後,最好把指針賦為空,防止無頭指針的出現。順便一說,release一個空指針是合法的,但是不會發生任何事情。

如果你在一個函數中創建並返回一個對象,那麽你需要把這個對象聲明為autorelease

(ClassA *)Function()

{

ClassA *a = [[[ClassA alloc] init] autorelease];

return a;

}

不這樣做的話,會造成內存泄露。

--------------------------------------------------------------------------------------------------------------------------------------------------------------

3.MRC的原理是什麽?

--------------------------------------------------------------------------------------------------------------------------------------------------------------

4.使用MRC應該註意些什麽?

--------------------------------------------------------------------------------------------------------------------------------------------------------------

5.使用MRC的時候存在的特例有哪些?

--------------------------------------------------------------------------------------------------------------------------------------------------------------

iOS----MRC(手動內存管理)