autorelease

autorelease是自動釋放,看上去像ARC,其實更相似與C語言的自動變量(沒有任何修飾符的局部變量)的特性。框架

C語言的自動變量特性:程序執行時,若自動變量超出其做用域,該自動變量將被自動廢棄。oop

{
  int a;
}

//由於超出變量做用域 自自動變量 int a 被廢棄,不能再訪問

autorelease 會像 C 的自動變量那樣來對待對象實例,當超出其做用域(至關於變量做用域)時,對象的release 實例方法 會被調用。spa

 

autorelease具體使用方法:

1.生成並持有NSAutoreleasePool 對象.net

2.調用已分配對象的autorelease 實例方法code

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對象進行生成、持有、廢棄處理。get

使用autorelease 會帶來的問題:若是大量產生autorelease的對象時,又不廢棄NSAutoreleasePool對象,那麼生成的對象就不能被釋放,所以有時會產生內存不足的現象。it

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

 

autorelease實例方法的本質:調用 NSAutoreleasePool 的 addObject 類方法。

也就是說調用autorelease 方法 會將調用的對象放入 自動釋放池 中 

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

 

 

ARC

@autoreleasepool{

  id __autoreleasing obj = [[NSObject alloc] init];
 
}

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

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

 

注意:加不加 __autoreleasing  修飾符  均可以。 爲何呢??

待續。。。

相關文章
相關標籤/搜索