成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

Objective C內存管理之理解autorelease

開發 后端
本系列文章將介紹的是Objective C內存管理的知識,這也是iPhone手機移動開發方面的重點知識。希望對大家有所幫助。

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

[[13090]]

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

答案是,對于每一個Runloop, 系統會隱式創建一個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。

原文標題:Objective C內存管理進階(二):理解autorelease

鏈接:http://www.cnblogs.com/MobileDevelop/archive/2010/07/19/1779138.html

責任編輯:楊鵬飛 來源: 博客園
相關推薦

2011-07-21 09:32:07

Objective-C 內存 Autoreleas

2011-08-16 17:43:47

Objective-C內存管理Autorelease

2011-05-11 15:45:50

內存管理Objective-C

2011-07-20 17:04:43

Objective-C 內存 內存泄露

2011-07-21 10:10:42

Objective-C 內存 Autoreleas

2011-07-18 17:14:16

Objective-C 內存 Cocoa

2010-07-20 08:49:00

Objective C

2014-03-12 09:37:22

內存管理autoreleaseautorelease

2011-08-01 11:37:41

iPhone Objective- 內存

2011-07-29 16:08:31

Objective-C 內存

2011-08-18 13:28:35

Objective-C內存

2011-07-19 15:15:09

Objective-C 內存

2011-07-21 09:42:27

Objective-C 內存 Autoreleas

2013-04-11 14:37:36

Objective-CiOS內存管理系統自動創建新的aut

2013-04-11 14:32:00

Objective-CiOS開發內存管理@synthesize

2011-06-16 08:48:33

Java

2013-04-11 14:16:57

Objective-CiOS開發內存管理

2021-12-14 07:40:07

C# 異步流結合體

2023-10-18 13:31:00

Linux內存

2017-02-09 21:24:22

iOS內存管理
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 久色网| 91精品国产综合久久福利软件 | 午夜精品久久久久久 | 国产成人精品一区二区三区视频 | 日韩av在线一区二区 | 成人在线 | 看av网 | 97精品国产97久久久久久免费 | 精品久久久久久久久久久久久久 | 日韩视频精品在线 | 精品国模一区二区三区欧美 | 国产一区视频在线 | 亚洲人成一区二区三区性色 | 亚洲欧美视频 | 欧美成人影院在线 | 一级免费毛片 | 日日夜夜精品视频 | 久久久久久国产精品 | 日本人爽p大片免费看 | 人人干人人干人人 | 亚洲天堂成人在线视频 | 国产一区久久久 | 亚洲欧美视频一区 | 国产精品久久久久久久久久久免费看 | 亚洲一区中文字幕 | 国产精品一区二区在线 | 成年人黄色一级毛片 | 国产日韩一区二区三免费高清 | 琪琪午夜伦伦电影福利片 | av片在线免费看 | 日韩不卡在线观看 | 国内精品在线视频 | 日韩精品一区二区三区在线观看 | 欧美日韩一区在线 | 国产福利视频 | 瑟瑟激情 | 欧美一极视频 | 久久99精品久久久97夜夜嗨 | 国内精品视频免费观看 | 欧美精品欧美精品系列 | 一区二区不卡高清 |