1.MRC是什麼,有什麼用?程序員
在蘋果開發中,咱們是沒有垃圾回收機制的。因此在ARC推出以前,咱們蘋果開發程序員須要經過手動代碼的形式儘可能嚴密的管理咱們的App的內存;函數
--------------------------------------------------------------------------------------------------------------------------------------------------------------spa
2.如何運用MRC管理內存?指針
1)實際關鍵字:對象
不管是ARC仍是MRC管理內存都涉及到幾個關鍵字符:內存
使用alloc、new、copy建立一個對象,該對象的retain count 都等於1,須要用release來釋放該對象。誰建立,誰去釋放。在這3鍾方法之外的方法建立的對象,都被系統默認的聲明爲autorelease。開發
ClassA *a = [[ClassA alloc] init];it
ClassA *b = a;io
[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的時候存在的特例有哪些?
--------------------------------------------------------------------------------------------------------------------------------------------------------------