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

Objective-C內存管理教程和原理剖析(四)

移動開發 iOS
初學Objective-C的朋友都有一個困惑,總覺得對Objective-C的內存管理機制琢磨不透,程序經常內存泄漏或莫名其妙的崩潰。我在這里總結了自己對Objective-C內存管理機制的研究成果和經驗,寫了這么一個由淺入深的教程。希望對大家有所幫助,也歡迎大家一起探討。

 

系統自動創建新的autorelease pool

在生成新的Run Loop的時候,系統會自動創建新的autorelease pool(非常感謝網友hhyytt和neogui的提醒)。注意,此處不同于xcode在新建項目時自動生成的代碼中加入的autorelease pool,xcode生成的代碼可以被刪除,但系統自動創建的新的autorelease pool是無法刪除的(對于無Garbage Collection的環境來說)。Objective-C沒有給出實現代碼,官方文檔也沒有說明,但我們可以通過小程序來證明。

在這個小程序中,我們先生成了一個autorelease pool,然后生成一個autorelease的ClassA的實例,再在一個新的run loop中生成一個autorelease的ClassB的對象(注意,我們并沒有手動在新run loop中生成autorelease pool)。精簡的示例代碼如下,詳細代碼請見附件中的memman-run-loop-with-pool.m。

 

  1. int main(int argc, char**argv)  
  2.          NSLog(@"create an autorelasePool\n"); 
  3.          NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];    
  4.          NSLog(@"create an instance of ClassA and autorelease\n"); 
  5.          ClassA *obj1 = [[[ClassA alloc] init] autorelease]; 
  6.          NSDate *now = [[NSDate alloc] init]; 
  7.          NSTimer *timer = [[NSTimer alloc] initWithFireDate:now 
  8.                    interval:0.0 
  9.                    target:obj1 
  10.                    selector:@selector(createClassB) 
  11.                    userInfo:nil 
  12.                    repeats:NO]; 
  13.          NSRunLoop *runLoop = [NSRunLoop currentRunLoop]; 
  14.          [runLoop addTimer:timer forMode:NSDefaultRunLoopMode]; 
  15.          [timer release]; 
  16.          [now release]; 
  17.          [runLoop run]; //在新loop中調用一函數,生成ClassB的autorelease實例 
  18.          NSLog(@"releasing autorelasePool\n"); 
  19.          [pool release]; 
  20.          NSLog(@"autorelasePool is released\n"); 
  21.          return 0; 
  22. }  

 

輸出如下:

create an autorelasePool

create an instance of ClassA and autorelease

create an instance of ClassB and autorelease

ClassB destroyed

releasing autorelasePool

ClassA destroyed

autorelasePool is released

注意在我們銷毀autorelease pool之前,ClassB的autorelease實例就已經被銷毀了。

有人可能會說,這并不能說明新的run loop自動生成了一個新的autorelease pool,說不定還只是用了老的autorelease pool,只不過后來drain了一次而已。我們可以在main函數中不生成autorelease pool。精簡的示例代碼如下,詳細代碼請見附件中的memman-run-loop-without-pool.m。

 

  1. int main(int argc, char**argv)  
  2.          NSLog(@"No autorelasePool created\n"); 
  3.          NSLog(@"create an instance of ClassA\n"); 
  4.          ClassA *obj1 = [[ClassA alloc] init]; 
  5.          NSDate *now = [[NSDate alloc] init]; 
  6.          NSTimer *timer = [[NSTimer alloc] initWithFireDate:now 
  7.                    interval:0.0 
  8.                    target:obj1 
  9.                    selector:@selector(createClassB) 
  10.                    userInfo:nil 
  11.                    repeats:NO]; 
  12.          NSRunloop *runLoop = [NSRunLoop currentRunLoop]; 
  13.          [runLoop addTimer:timer forMode:NSDefaultRunLoopMode]; 
  14.          [timer release]; 
  15.          [now release]; 
  16.          [runLoop run]; //在新loop中調用一函數,生成ClassB的autorelease實例 
  17.          NSLog(@"Manually release the instance of ClassA\n"); 
  18.          [obj1 release]; 
  19.          return 0; 
  20. }  

 

輸出如下:

No autorelasePool created

create an instance of ClassA

create an instance of ClassB and autorelease

ClassB destroyed

Manually release the instance of ClassA

ClassA destroyed

我們可以看出來,我們并沒有創建任何autorelease pool,可是ClassB的實例依然被自動銷毀了,這說明新的run loop自動創建了一個autorelease pool,這個pool在新的run loop結束的時候會銷毀自己(并自動release所包含的對象)。

補充說明

在研究retain count的時候,我不建議用NSString。因為在下面的語句中,

 

  1. NSString *str1 = @”constant string”; 

str1的retain count是個很大的數字。Objective-C對常量字符串做了特殊處理。

當然,如果你這樣創建NSString,得到的retain count依然為1

  1. NSString *str2 = [NSString stringWithFormat:@”123”]; 

 示例代碼文件鏈接:http://files.cnblogs.com/VinceYuan/objective-c-memman.zip

 

 
責任編輯:閆佳明 來源: oschina
相關推薦

2011-07-19 15:15:09

Objective-C 內存

2011-07-21 09:42:27

Objective-C 內存 Autoreleas

2013-04-11 14:32:00

Objective-CiOS開發內存管理@synthesize

2013-04-11 13:57:27

Objective-CiOS開發內存管理

2013-04-11 14:16:57

Objective-CiOS開發內存管理

2011-07-18 17:14:16

Objective-C 內存 Cocoa

2011-07-27 17:10:30

Objective-C 持久化

2011-07-29 16:08:31

Objective-C 內存

2011-05-11 15:45:50

內存管理Objective-C

2011-07-20 17:04:43

Objective-C 內存 內存泄露

2011-07-21 09:32:07

Objective-C 內存 Autoreleas

2011-07-21 10:10:42

Objective-C 內存 Autoreleas

2011-08-01 11:37:41

iPhone Objective- 內存

2011-08-16 17:43:47

Objective-C內存管理Autorelease

2011-08-18 13:28:35

Objective-C內存

2011-07-08 13:49:46

Objective-C UUID

2011-08-05 14:03:39

Objective-C 對象 模板

2011-08-22 09:48:16

WindowsObjective-C

2011-08-16 10:23:04

Objective-CNSAutoreleaXcode常用鍵

2013-05-02 10:51:17

iOS開發Objective-C@property
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 欧美在线一区二区三区 | www.久久久久久久久久久久 | av在线播放国产 | 国产精品黄色 | 天天色综 | 亚洲午夜三级 | 国产成人av在线播放 | 视频一区在线观看 | 亚洲高清一区二区三区 | 91看片在线观看 | 日本免费一区二区三区 | 日本超碰| 日韩视频二区 | 成人福利网 | 午夜爽爽爽男女免费观看影院 | 精品欧美一区二区久久久伦 | 国产在线观看一区二区 | 亚洲精品欧美一区二区三区 | 日本久久精品视频 | 亚洲精品免费在线观看 | 黄色福利 | 九九久视频 | 亚州精品天堂中文字幕 | 美女久久| 中文字幕亚洲视频 | 中文字幕av在线一二三区 | 日日摸夜夜添夜夜添特色大片 | 欧美日韩中文字幕在线 | 亚洲天堂日韩精品 | 欧美成人性生活 | 国产成人综合在线 | 国产午夜精品久久久 | 久久九九色 | 米奇7777狠狠狠狠视频 | 三级成人在线 | 成人做爰999| 午夜小电影 | 欧美日韩国产精品一区二区 | 高清免费av | 国产精品日韩在线观看 | 日韩欧美在线播放 |