Objective-C內存管理如何理解Autorelease
Objective-C內存管理如何理解Autorelease是本文要介紹的內容,主要是來學習Autorelease如何使用,具體內容來看本文詳細講解。如果你能夠真正的理解autorelease,那么你才是理解了Objective-C的內存管理。
Autorelease實際上只是把對release的調用延遲了,對于每一個Autorelease,系統只是把該Object放入了當前的Autorelease pool中,當該pool被釋放時,該pool中的所有Object會被調用Release。
實際上對于 [NSString stringWithFormat:] 這類構造函數返回的對象都是autorelease的。
autorelease pool來避免頻繁申請/釋放內存(就是pool的作用了)。這個應該是相對比較好理解的。
總結:一定要注意Autorelease pool的生存周期,理解Runloop,避免在對象被釋放后使用。
- [NSString stringWithFormat:]
這類函數返回的對象是不需要再自己release的,它已經被autorelease了, 如果你想把它當一個全局對象使用,那必須自己再retain, 釋放時再release。
為什么需要Auto release ?
很多C/C++轉過來的程序員會說,這個auto release有什么好,象C/C++那樣,自己申請,自己釋放,完全可控不好么, 這個auto relase 完全不可控,你都不知到它什么時候會被真正的release。我的理解它有一個作用就是可以做到每個函數對自己申請的對象負責,自己申請,自己釋放,該函數的調用者不需要關心它內部申請對象的管理。 在下面這個例子中,Func1的調用者不需要再去關心obj的釋放。
- ClassA *Func1() {
- ClassA *obj = [[[ClassA alloc]init]autorelease];
- return obj;
- }
在Iphone項目中,大家會看到一個默認的Autorelease pool,程序開始時創建,程序退出時銷毀,按照對Autorelease的理解,豈不是所有autorelease pool里的對象在程序退出時才release, 這樣跟內存泄露有什么區別?
答案是,對于每一個Runloop, 系統會隱式創建一個Autorelease pool,這樣所有的release pool會構成一個象CallStack一樣的一個棧式結構,在每一個Runloop結束時,當前棧頂的Autorelease pool會被銷毀,這樣這個pool里的每個Objective-C會被release。
那什么是一個Runloop呢? 一個UI事件,Timer call, delegate call, 都會是一個新的Runloop。例子如下:
- NSString* globalObject;
- - (void)applicationDidFinishLaunching:(UIApplication *)application {
- globalObject = [[NSString alloc] initWithFormat:@"Test"];
- NSLog(@"Retain count after create: %d", [globalObject retainCount]);
- // output 1. [globalObject retain];
- NSLog(@"Retain count after retain: %d", [globalObject retainCount]);
- // output 2.
- }
- - (void)applicationWillTerminate:(UIApplication *)application {
- NSLog(@"Retain count after Button click runloop finished: %d", [globalObject retainCount]);
- // 輸出1. Button click loop finished, it's autorelease pool released, globalObject get released once.
- }
- -(IBAction)onButtonClicked {
- [globalObject autorelease];
- NSLog(@"Retain count after autorelease: %d", [globalObject retainCount]);
- // 輸出2。 Autorelease被call, globalObject被加如當前的AutoreleaePool。
- }
小結:Objective-C內存管理:如何理解Autorelease的內容介紹完了,希望通過本文的學習能對你有所幫助!