autorelease

autorelease
1 Star2 Stars3 Stars4 Stars5 Stars 給文章打分!
Loading...

autorelease是自動釋放,看上去像ARC,其實更類似與C語言的自動變數(沒有任何修飾符的區域性變數)的特性。

C語言的自動變數特性:程式執行時,若自動變數超出其作用域,該自動變數將被自動廢棄。

{
int a;
}
//因為超出變數作用域 自自動變數 int a 被廢棄,不能再訪問

autorelease 會像 C 的自動變數那樣來對待物件例項,當超出其作用域(相當於變數作用域)時,物件的release 例項方法 會被呼叫。

 

autorelease具體使用方法:

1.生成並持有NSAutoreleasePool 物件

2.呼叫已分配物件的autorelease 例項方法

3.廢棄NSAutoreleasePool 物件

 

NSAutoreleasePool 物件的生存週期 相當於 C語言的自動變數作用域,對於所有呼叫過autorelease例項方法的物件,在廢棄NSAutoreleasePool 物件時,都將呼叫release例項方法。

 

用原始碼表示如下:

NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
id obj = [[NSObject alloc] init];
//將obj物件加入pool中
[obj autorelease]; 
//等同於[pool release]
[pool drain]; 

在cocoa 框架中,相當於程式主迴圈的NSRunLoop 或 在程式可執行的地方,對NSAutoreleasePool物件進行生成、持有、廢棄處理。

使用autorelease 會帶來的問題:如果大量產生autorelease的物件時,又不廢棄NSAutoreleasePool物件,那麼生成的物件就不能被釋放,因此有時會產生記憶體不足的現象。

解決辦法:有必要在適當的地方生成、持有或廢棄NSAutoreleasePool物件。

 

autorelease例項方法的本質:呼叫 NSAutoreleasePool 的 addObject 類方法。

也就是說呼叫autorelease 方法 會將呼叫的物件放入 自動釋放池 中 

- (id)autorelease{
[NSAutoreleasePool addObject:self];
}

 

 

ARC

@autoreleasepool{
id __autoreleasing obj = [[NSObject alloc] init];
}

在ARC有效時,用 @autoreleasepool塊 替代 NSAutoreleasePool類, 

                     用附有 __autoreleasing 修飾符的變數  替代  autorelease 方法。

 

注意:加不加 __autoreleasing  修飾符  都可以。 為什麼呢??

待續。。。

IOS開發 最新文章