autorelease是自動釋放,看上去像ARC,其實更相似與C語言的自動變量(沒有任何修飾符的局部變量)的特性。框架
C語言的自動變量特性:程序執行時,若自動變量超出其做用域,該自動變量將被自動廢棄。oop
{ int a; } //由於超出變量做用域 自自動變量 int a 被廢棄,不能再訪問
autorelease 會像 C 的自動變量那樣來對待對象實例,當超出其做用域(至關於變量做用域)時,對象的release 實例方法 會被調用。spa
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]; }
@autoreleasepool{ id __autoreleasing obj = [[NSObject alloc] init]; }
在ARC有效時,用 @autoreleasepool塊 替代 NSAutoreleasePool類,
用附有 __autoreleasing 修飾符的變量 替代 autorelease 方法。
注意:加不加 __autoreleasing 修飾符 均可以。 爲何呢??
待續。。。