ios自動釋放池(autoreleasepool)
阿新 • • 發佈:2019-01-26
#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。(暫沒有在官方文件中找到這個解釋)