日韩无码专区无码一级三级片|91人人爱网站中日韩无码电影|厨房大战丰满熟妇|AV高清无码在线免费观看|另类AV日韩少妇熟女|中文日本大黄一级黄色片|色情在线视频免费|亚洲成人特黄a片|黄片wwwav色图欧美|欧亚乱色一区二区三区

RELATEED CONSULTING
相關咨詢
選擇下列產品馬上在線溝通
服務時間:8:30-17:00
你可能遇到了下面的問題
關閉右側工具欄

新聞中心

這里有您想知道的互聯(lián)網營銷解決方案
ObjectiveC內存管理之理解autorelease

如果你能夠真正的理解autorelease,那么你才是理解了Objective c的內存管理。Autorelease實際上只是把對release的調用延遲了,對于每一個Autorelease,系統(tǒng)只是把該Object放入了當前的Autorelease pool中,當該pool被釋放時,該pool中的所有Object會被調用Release。

創(chuàng)新互聯(lián)長期為上千多家客戶提供的網站建設服務,團隊從業(yè)經驗10年,關注不同地域、不同群體,并針對不同對象提供差異化的產品和服務;打造開放共贏平臺,與合作伙伴共同營造健康的互聯(lián)網生態(tài)環(huán)境。為陽西企業(yè)提供專業(yè)的網站設計制作、成都網站制作,陽西網站改版等技術服務。擁有十載豐富建站經驗和眾多成功案例,為您定制開發(fā)。

[1]在Iphone項目中,大家會看到一個默認的Autorelease pool,程序開始時創(chuàng)建,程序退出時銷毀,按照對Autorelease的理解,豈不是所有autorelease pool里的對象在程序退出時才release, 這樣跟內存泄露有什么區(qū)別?

答案是,對于每一個Runloop, 系統(tǒng)會隱式創(chuàng)建一個Autorelease pool,這樣所有的release pool會構成一個象CallStack一樣的一個棧式結構,在每一個Runloop結束時,當前棧頂的Autorelease pool會被銷毀,這樣這個pool里的每個Object會被release。

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

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

[2]為什么需要Auto release ?

2.1)很多C/C++轉過來的程序員會說,這個auto release有什么好,象C/C++那樣,自己申請,自己釋放,完全可控不好么, 這個auto relase 完全不可控,你都不知到它什么時候會被真正的release。我的理解它有一個作用就是可以做到每個函數對自己申請的對象負責,自己申請,自己釋放,該函數的調用者不需要關心它內部申請對象的管理。  在下面這個例子中,Func1的調用者不需要再去關心obj的釋放。

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

實際上對于 [NSString stringWithFormat:] 這類構造函數返回的對象都是autorelease的。

2.2) autorelease pool來避免頻繁申請/釋放內存(就是pool的作用了)。這個應該是相對比較好理解的。

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

2)[NSString stringWithFormat:]這類函數返回的對象是不需要再自己release的,它已經被autorelease了, 如果你想把它當一個全局對象使用,那必須自己再retain, 釋放時再release。


標題名稱:ObjectiveC內存管理之理解autorelease
網頁地址:http://www.5511xx.com/article/cohcgdd.html