1. 程式人生 > >ios自動釋放池(autoreleasepool)

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。(暫沒有在官方文件中找到這個解釋)