Objective C內存管理進階(二):理解autorelease

轉自:http://www.cnblogs.com/MobileDevelop/archive/2010/07/19/1779138.html

http://keywind.me/?p=189

如果你能夠真正的理解autorelease, 那麼你纔是理解了Objective c的內存管理。Autorelease實際上只是把對release的調用延遲了,對於每一個Autorelease, 系統只是把該Object放入了當前的Autorelease pool中, 當該pool被釋放時,該pool中的所有Object會被調用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。 
}


ClassA *Func1()

{

  ClassA *obj = [[[ClassA alloc]init]autorelease];

  return obj;

}



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章