自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

Objective-C內(nèi)存管理如何理解Autorelease

移動(dòng)開(kāi)發(fā) iOS
Objective-C內(nèi)存管理如何理解Autorelease是本文要介紹的內(nèi)容,主要是來(lái)學(xué)習(xí)Autorelease如何使用,具體內(nèi)容來(lái)看本文詳細(xì)講解。如果你能夠真正的理解autorelease,那么你才是理解了Objective-C的內(nèi)存管理。

Objective-C內(nèi)存管理如何理解Autorelease是本文要介紹的內(nèi)容,主要是來(lái)學(xué)習(xí)Autorelease如何使用,具體內(nèi)容來(lái)看本文詳細(xì)講解。如果你能夠真正的理解autorelease,那么你才是理解了Objective-C內(nèi)存管理。

Autorelease實(shí)際上只是把對(duì)release的調(diào)用延遲了,對(duì)于每一個(gè)Autorelease,系統(tǒng)只是把該Object放入了當(dāng)前的Autorelease pool中,當(dāng)該pool被釋放時(shí),該pool中的所有Object會(huì)被調(diào)用Release。

實(shí)際上對(duì)于 [NSString stringWithFormat:] 這類(lèi)構(gòu)造函數(shù)返回的對(duì)象都是autorelease的。

autorelease pool來(lái)避免頻繁申請(qǐng)/釋放內(nèi)存(就是pool的作用了)。這個(gè)應(yīng)該是相對(duì)比較好理解的。

總結(jié):一定要注意Autorelease pool的生存周期,理解Runloop,避免在對(duì)象被釋放后使用。

  1. [NSString stringWithFormat:] 

這類(lèi)函數(shù)返回的對(duì)象是不需要再自己release的,它已經(jīng)被autorelease了, 如果你想把它當(dāng)一個(gè)全局對(duì)象使用,那必須自己再retain, 釋放時(shí)再release。

為什么需要Auto release ?

很多C/C++轉(zhuǎn)過(guò)來(lái)的程序員會(huì)說(shuō),這個(gè)auto release有什么好,象C/C++那樣,自己申請(qǐng),自己釋放,完全可控不好么, 這個(gè)auto relase 完全不可控,你都不知到它什么時(shí)候會(huì)被真正的release。我的理解它有一個(gè)作用就是可以做到每個(gè)函數(shù)對(duì)自己申請(qǐng)的對(duì)象負(fù)責(zé),自己申請(qǐng),自己釋放,該函數(shù)的調(diào)用者不需要關(guān)心它內(nèi)部申請(qǐng)對(duì)象的管理。  在下面這個(gè)例子中,F(xiàn)unc1的調(diào)用者不需要再去關(guān)心obj的釋放。

  1. ClassA *Func1()  {       
  2.  ClassA *obj = [[[ClassA alloc]init]autorelease];  
  3.        return obj;    
  4.  }  

在Iphone項(xiàng)目中,大家會(huì)看到一個(gè)默認(rèn)的Autorelease pool,程序開(kāi)始時(shí)創(chuàng)建,程序退出時(shí)銷(xiāo)毀,按照對(duì)Autorelease的理解,豈不是所有autorelease pool里的對(duì)象在程序退出時(shí)才release, 這樣跟內(nèi)存泄露有什么區(qū)別?

答案是,對(duì)于每一個(gè)Runloop, 系統(tǒng)會(huì)隱式創(chuàng)建一個(gè)Autorelease pool,這樣所有的release pool會(huì)構(gòu)成一個(gè)象CallStack一樣的一個(gè)棧式結(jié)構(gòu),在每一個(gè)Runloop結(jié)束時(shí),當(dāng)前棧頂?shù)腁utorelease pool會(huì)被銷(xiāo)毀,這樣這個(gè)pool里的每個(gè)Objective-C會(huì)被release。

那什么是一個(gè)Runloop呢? 一個(gè)UI事件,Timer call, delegate call, 都會(huì)是一個(gè)新的Runloop。例子如下:

  1. NSString* globalObject;    
  2. - (void)applicationDidFinishLaunching:(UIApplication *)application   {      
  3.       globalObject = [[NSString alloc] initWithFormat:@"Test"];        
  4.       NSLog(@"Retain count after create: %d", [globalObject retainCount]);   
  5.       // output 1.      [globalObject retain];        
  6.       NSLog(@"Retain count after retain: %d", [globalObject retainCount]);   
  7.       // output 2.   
  8.     }    
  9.   - (void)applicationWillTerminate:(UIApplication *)application  {     
  10.         NSLog(@"Retain count after Button click runloop finished: %d", [globalObject retainCount]);         
  11.         // 輸出1. Button click loop finished, it's autorelease pool released, globalObject get released once.   
  12.     }    
  13.   -(IBAction)onButtonClicked  {       
  14.        [globalObject autorelease];        
  15.        NSLog(@"Retain count after autorelease: %d", [globalObject retainCount]);         
  16.        // 輸出2。 Autorelease被call, globalObject被加如當(dāng)前的AutoreleaePool。  
  17.  }  

小結(jié):Objective-C內(nèi)存管理:如何理解Autorelease的內(nèi)容介紹完了,希望通過(guò)本文的學(xué)習(xí)能對(duì)你有所幫助!

責(zé)任編輯:zhaolei 來(lái)源: 互聯(lián)網(wǎng)
相關(guān)推薦

2011-07-21 09:32:07

Objective-C 內(nèi)存 Autoreleas

2010-07-20 08:50:00

autoreleaseObjective C

2011-05-11 15:45:50

內(nèi)存管理Objective-C

2011-07-20 17:04:43

Objective-C 內(nèi)存 內(nèi)存泄露

2011-07-21 10:10:42

Objective-C 內(nèi)存 Autoreleas

2011-07-18 17:14:16

Objective-C 內(nèi)存 Cocoa

2011-08-01 11:37:41

iPhone Objective- 內(nèi)存

2011-07-29 16:08:31

Objective-C 內(nèi)存

2011-08-18 13:28:35

Objective-C內(nèi)存

2011-07-19 15:15:09

Objective-C 內(nèi)存

2011-07-21 09:42:27

Objective-C 內(nèi)存 Autoreleas

2013-04-11 14:37:36

Objective-CiOS內(nèi)存管理系統(tǒng)自動(dòng)創(chuàng)建新的aut

2013-04-11 14:32:00

Objective-CiOS開(kāi)發(fā)內(nèi)存管理@synthesize

2015-07-08 10:51:27

Objective-CRuntime

2011-07-22 15:42:39

Objective-C UIView 內(nèi)存

2011-08-10 18:07:29

Objective-C反射

2013-03-27 12:54:00

iOS開(kāi)發(fā)Objective-C

2011-05-11 11:20:26

Objective-C

2011-05-11 15:58:34

Objective-C

2013-06-20 10:40:32

Objective-C實(shí)現(xiàn)截圖
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)