iOS autorelease的實(shí)現(xiàn)原理

autorelease就是自動(dòng)釋放,會(huì)像C語言的自動(dòng)變量那樣來對待對象實(shí)例。當(dāng)超出作用于時(shí),對象實(shí)例的release實(shí)例方法被調(diào)用。

一、autorelease的具體使用方法如下:

(1)生產(chǎn)并持有NSAutoreleasePool對象;
(2)調(diào)用分配對象的autorelease實(shí)例方法;
(3)飛起NSAutoreleasePool對象。
NSAutoreleasePool對象的生命周期相當(dāng)于C語言變量的作用域。對于所有吊用過autorelease實(shí)例方法對象,在廢棄NSAutoreleasePool對象時(shí),都將調(diào)用release實(shí)例方法。
用源代碼表示如下:

NSAutoreleasePool *pool = [[NSAutoreleasePool alloc]init];
id obj = [[NSObject alloc]init];
[obj autorelease];
[pool drain];

注意:大量產(chǎn)生autorelease的對象時(shí),只要不廢棄NSAutoreleasePool對象,那么生產(chǎn)的對象就不能釋放,因此有時(shí)會(huì)產(chǎn)生內(nèi)存不足的現(xiàn)象。

Cocoa框架中也有很多類方法用于返回autorelease的對象。比如NSMutableArray類的arrayWithCapacity類方法
id array = [NSMutableArray arrayWithCapacity:1];

此源代碼等同于以下源碼。

id array = [[[NSMutableArray  alloc]initWithCapacity:1]autorelease];
二、autorelease實(shí)現(xiàn)
[obj autorelease];

此源代碼調(diào)用NSObject類的autorelease實(shí)例方法。

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

下面看一下NSAutoreleasePool類的實(shí)現(xiàn)。由于NSAutoreleasePool類的源代碼比較復(fù)雜,所以我們假想一個(gè)簡化的源代碼進(jìn)行說明。

+ (void)addObject:(id)obj {
    NSAutoreleasePool *pool = 取得正在使用的NSAutoreleasePool對象;
  if(pool != nil){
     [pool  addOject:anObj];
  }else {
      NSLog(@"NSAutoreleasePool對象非存在狀態(tài)下調(diào)用autorelease")
  }  
}

addObject類方法調(diào)用正在使用的NSAutoreleasePool對象的addObject實(shí)例方法。

 - (void)addObject:(id)anObj {
  [array addObject:anObj];
}

總結(jié):如果調(diào)用NSObject類的autorelease實(shí)例方法,該對象將被追加到正在使用的NSAutoreleasePool 對象中的數(shù)組里

以下為通過drain實(shí)例方法廢棄正在使用的NSAutoreleasePool對象的過程
-  (void)drain {
  [self dealloc];
}
- (void)dealloc {
  [self emptyPool];
  [array release];
}
- (void)emptyPool {
  for(id obj in array) {//數(shù)組里面的所有對象都調(diào)用release實(shí)例方法
    [obj release];
  }
}
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容