天天看點

ios自動釋放池(autoreleasepool)

#import <Foundation/Foundation.h>

@interface Test : NSObject
@end

@implementation Test
@end


int main (int argc, const char * argv[]) {
	
	NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];
	Test *test = [[Test alloc]init];
	
	NSLog(@"對象初始化以後的引用計數為:%x",[test retainCount]);
	
	[pool drain];
	NSLog(@"釋放自動釋放池以後,對象的引用計數為:%x",[test retainCount]);
	
	pool = [[NSAutoreleasePool alloc]init];
	[test autorelease];
	NSLog(@"将對象添加到自動釋放池以後的引用計數為:%x",[test retainCount]);
	
	[test retain];
	NSLog(@"對象進行retain後的引用計數為:%x",[test retainCount]);
	
	[pool drain];
	NSLog(@"釋放自動釋放池以後,對象的引用計數為:%x",[test retainCount]);
	
	[test release];
	return 0;
}
           

通過使用autorelease,該對象就被放入自動釋放池,系統自動跟蹤每個對象的使用情況,并在釋放自動釋放池時,釋放池中所有對象。

上面這一段代碼是書上的,但很好說明了autoreleasepool的用法,以前老師們常說不能死讀書的,應是多思考,自己動手寫執行個體,多提問,多讨論吧

這裡我把的思考寫出來,供大家參考:

1.autoreleasepool隻能放也池中的對象起作用,我們手工管理記憶體它不管,也就是說手工或自動(系統)兩套不同的機制;

2.加入用[test autorelease],釋放用pool drain

3.autoreleasepool不是系統的垃圾收集功能(Garbage Colliction)      

4.aotoreleasepool到達底什麼時候釋放?是pool drain後就釋放了嗎?

對于每一個Runloop, 系統會隐式建立一個Autorelease pool(自然會有多個Autorelease pool),這樣所有的release pool會構成一個象CallStack一樣的一個棧式結構,在每一個Runloop結束時,目前棧頂的Autorelease pool會被銷毀,這樣這個pool裡的每個Object會被release。

那什麼是一個Runloop呢? 一個UI事件,Timer call, delegate call, 都會是一個新的Runloop。(暫沒有在官方文檔中找到這個解釋)