1. 程式人生 > >【Objective-C】OC中自動釋放池的基本概念和使用方法

【Objective-C】OC中自動釋放池的基本概念和使用方法

自動釋放池的基本概念

     cocoa中有一個自動釋放池(Autorelease Pool)的概念,顧名思義,它是可以存放一些實體的

集合,在這個自動釋放池中的物件,是能夠被自動釋放的。NSObject類提供了一個autorelease

訊息,當我們向一個物件傳送一個autorelease訊息時,這個物件就被放入到自動釋放池。

建立自動釋放池

    @autoreleasepool {

//入池對5.0之後的寫法}NSAutoreleasePool*pool=[[NSAutoreleasePool alloc]init];// 入池對5.0之前的寫法[pool autorelease
];
自動釋放池的銷燬時間
當我們將一個物件傳送了autorelease訊息時,當子自動釋放池銷燬時,會對池中的每一個物件
傳送一條release訊息,以此來進行釋放它們。
(一):下面來看例項:建立一個Person例項物件,然後加入到自動釋放池中,向該例項物件傳送一條autorelease訊息,
來檢視一下它的生命週期)
@autoreleasepool{
//入池對5.0之後的寫法Person*tom=[[Person alloc]init];[tom autorelease];NSLog(@"pool exist");}NSLog(@"pool dead");

(二):接著上面的例子,向該物件傳送一條
retain訊息,看下宣告週期
@autoreleasepool{
//入池對5.0之後的寫法Person*tom=[[Person alloc]init];//1[tom autorelease];[tom retain];//2NSLog(@"pool exist");NSLog(@"tom %ld",[tom retainCount]);[tom release];//1NSLog(@"tom %ld",[tom retainCount]);

(三):接著上面的例子,如果有多個自動釋放池的問題,根據傳送的autorelease訊息來進行判斷是
物件加入的那個自動釋放池,
@autoreleasepool{
Person
*tom=[[Person alloc]init];//1@autoreleasepool{//入池對5.0之後的寫法[tom autorelease];[tom retain];NSLog(@"pool exist");NSLog(@"tom1 %ld",[tom retainCount]);}NSLog(@"pool1 dead");NSLog(@"tom2 %ld",[tom retainCount]);}NSLog(@"pool2 dead");

【小結】:
1:自動釋放池的資料結構
自動釋放池是以棧的形式實現,當你建立一個新的自動釋放池,它將會被新增到棧頂。接受autorelease
訊息的物件將會唄放入棧頂
2:如何持有物件
當我們使用alloccopy,retain物件獲取一個物件時,我們需要負責顯示的安排物件的銷燬,其他方法獲取的
的物件將交給自動釋放池進行釋放(單例模式除外)
3releasedrain的區別
當我們向自動釋放池pool傳送release訊息,將會向池中臨時物件傳送一條release訊息,並且自身也會唄銷燬。
向它傳送drain訊息時,只會指定前者。