ARC,MRC,自動釋放池(基礎教程)

2021-12-30 02:50:26 字數 2107 閱讀 1801

在ios中記憶體管理幾乎是每個人必須知道的乙個知識點。首先我們總結一下mrc,再通過mrc來認識arc以及自動釋放池

1.mrc

1.1 淘汰的技術

1.2 引用計數(rc)是指alloc自動分配的一塊兒儲存空間,用於儲存持有該空間的指標個數

1.3 使用retaincount方法檢視rc的值

1.4 使用retain方法將rc加1

1.5 使用release方法將rc減1(修改rc值)

1.5.1 結果不為0,release方法直接返回

1.5.2 為0,則先呼叫dealloc,然後釋放rc所在的堆空間

1.6 retain做property的引數時,可以在set方法中自動新增持有方法,使rc加1。注意:一旦新增,必須在dealloc方法中釋放

下面我們一起看一下demo,一起體會一下mrc的流程

showpoint方法為顯示點的座標

shopointrc方法為顯示該空間的rc值

point *p1 = [[point alloc] initwithx:10 andy:20];

[self showpoint:p1];

//分配空間rc+1

[self showpointrc:p1];

point *p2 = p1;

[p2 retain];//retain方法可以將指標p2持有其指向的空間

//p2也持有該空間,rc變成2

[self showpointrc:p1];

[p2 release];

//釋放指標p2,持有該空間的指標數變為1,rc為1

[self showpointrc:p1];

[p1 release];

// 已經釋放記憶體空間,無法顯示rc

// [self showpointrc:p1];

再看乙個mrc時經常出錯的demo.並且一起學習一下retain作為屬性的使用,以及dealloc方法

準備工作,建乙個circle類,circle類中有乙個屬性是point類。

可以看到如果直接釋放circle類,會造成記憶體洩漏,因為center類沒有釋放。circle類釋放了,也無法找到c.center的指標。這塊空間永遠被持有。

point *p = [[point alloc] initwithx:10 andy:20];

circle *c = [[circle alloc] init];

c.center = p;

//[c.center retain];//在property的引數中新增retain,可以自動實現此句的功能

//...

[self showpointrc:p];

[p release];

//[c.center release];//此句被放到circle類的dealloc方法中

[c release];

}circle類中的屬性,以及dealloc方法

.h中@inte***ce trcircle : nsobject

@property(retain) trpoint *center;

@property double radius;

@end

.m中@implementation trcircle

-(void)dealloc

@end

2.arc

2.1 ios5.0開始使用,ios7.0強制使用

2.2 不允許程式設計師呼叫retain、release、retaincount方法,而由編譯器自動新增完成其呼叫語句

3.自動釋放池

3.1 在arc中是已經過時的技術

3.2 是乙個集合,其中有許多物件

3.3 當自動釋放池的作用域結束時,池中的所有物件會被一次性全部釋放

3.4 工廠方法生成的物件一般會被放入自動釋放池

3.5 自動釋放池的巢狀

下面一起看一下自動釋放池的使用demo

@autoreleasepool

nslog(@"*****=");

我們先分析一下,我們沒有新增釋放p指標的操作,利用自動釋放池實現,那麼什麼時候實現該操作的呢。我們可以在point類中重寫dealloc方法,輸出釋放點的提示。應該在自動釋放池結束的地方 也就是右}的地方結束。驗證如下圖:

自動釋放池

自動釋放池是什麼時候建立的?又是什麼時候銷毀的?原題 思考 1,有返回值的類方法建立出來的物件都是autorelease的。autorelease物件出了作用域後,就會被新增到自動釋放池中。如果largenumber非常大,有可能在乙個for中就把自動釋放池填滿,記憶體消耗非常大!2,解決方案 在f...

自動釋放池

autorelease本質上就是延遲呼叫release方法 autorelease物件什麼時候釋放?引用計數為0的時候才會釋放,不是出了pool就釋放 在一些很消耗記憶體的迴圈呼叫的場景下有時需要手動干預autoreleased物件的釋放時機,不然會導致記憶體暴增,最終導致程式崩潰 nsthread...

自動釋放池

自動釋放池是允許你放棄對乙個物件的持有關係,但可以避免它立即被 的乙個工具,當從方法返回你的物件的時候,這個功能很有用。1 程式的入口處於在main 函式 這就意味著整個應用都在自動釋放池中,所有的物件最後都會被 int main int argc,char argv 2 autoreleasepo...