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];
}
}