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

Objective-C內存管理如何理解Autorelease

移動開發 iOS
Objective-C內存管理如何理解Autorelease是本文要介紹的內容,主要是來學習Autorelease如何使用,具體內容來看本文詳細講解。如果你能夠真正的理解autorelease,那么你才是理解了Objective-C的內存管理。

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,避免在對象被釋放后使用。

  1. [NSString stringWithFormat:] 

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

為什么需要Auto release ?

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

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

在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。例子如下:

  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被加如當前的AutoreleaePool。  
  17.  }  

小結:Objective-C內存管理:如何理解Autorelease的內容介紹完了,希望通過本文的學習能對你有所幫助!

責任編輯:zhaolei 來源: 互聯網
相關推薦

2011-07-21 09:32:07

Objective-C 內存 Autoreleas

2010-07-20 08:50:00

autoreleaseObjective C

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

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-07-22 15:42:39

Objective-C UIView 內存

2015-07-08 10:51:27

Objective-CRuntime

2011-08-10 18:07:29

Objective-C反射

2013-06-20 10:40:32

Objective-C實現截圖

2013-03-27 12:54:00

iOS開發Objective-C

2011-05-11 15:58:34

Objective-C

2011-05-11 11:20:26

Objective-C
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 91视频在线看 | 亚洲欧美精品国产一级在线 | 欧美国产中文 | 国产无套一区二区三区久久 | 久久精品免费观看 | 在线观看亚洲专区 | 欧美视频成人 | 中文字幕一区二区三区精彩视频 | 台湾佬成人网 | 国产在线观看网站 | 97av| 偷派自拍| 国产一区亚洲 | 亚洲精品久久久一区二区三区 | 亚洲成在线观看 | 韩日一区二区三区 | 欧美日韩精品一区二区 | 日韩精品免费在线观看 | 9999国产精品欧美久久久久久 | a级大片免费观看 | 日韩精品1区2区3区 国产精品国产成人国产三级 | 成人在线中文字幕 | 一区二区三区精品在线 | 亚洲精品九九 | 欧美日韩国产一区二区 | 91免费版在线观看 | 久久精品免费观看 | 日韩国产一区二区三区 | 日韩欧美国产精品综合嫩v 一区中文字幕 | 欧美日韩大陆 | www.伊人.com | 精品国产黄色片 | 一区二区免费 | 国产黄色大片在线观看 | 久久99久久98精品免观看软件 | 亚洲成人一区二区 | 91高清在线观看 | 久久精品免费看 | 麻豆精品久久 | 久久人人爽人人爽 | 天天爱天天操 |