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

詳解iPhone應用中內存泄露使用Leaks工具指引

移動開發 iOS
iPhone應用中內存泄露使用Leaks工具指引是本文要要介紹的內容,主要是倆學習iphone應用內存的管理,來看本文詳解。

iPhone應用內存泄露使用Leaks工具指引是本文要要介紹的內容,主要是倆學習iphone應用內存的管理。最近常使用Instruments這個工具,我發現它對追蹤游戲中的內存泄露非常有幫助。自從發現Instruments如此有用后,我就覺得寫一篇文章介紹如何使用它來追蹤內存泄露對其他人也會有幫助。

什么是內存泄露?我為什么要關心內存泄露?

…此段省略…

訪問維基百科可以獲得更多關于內存泄露的信息。

我如何知道內存泄露了?

一些內存泄露可以很容易地通過閱讀代碼來發現,另一些就要困難點了,這就是為什么需要Instruments 的原因。Instruments 有一個“Leaks工具”,它會準確地告訴你什么地方發生了內存泄露,以便你能定位和修復泄露問題。

例子程序

我寫了一個例子程序,它有兩個地方會發生內存泄露,一個在 Objective-C 視圖控制器中,另一個在 C++ 類中。例程可以從這里獲得。下邊的代碼是從例程里摘錄的,包含了我們需要追蹤內存泄露的代碼。

  1. // Leaky excerpts – see GitHub for complete source  
  2.  
  3. - (void)viewDidLoad {  
  4. [super viewDidLoad];  
  5.  
  6. LeakyClass* myLeakyInstance = new LeakyClass();  
  7. delete myLeakyInstance;  
  8.  
  9. mMyLeakyString = [[NSString alloc] initWithUTF8String:”I’m a leaky string.”];  
  10.  
  11. [self doSomethingNow];  
  12. }  
  13.  
  14. - (void) doSomethingNow  
  15. {  
  16. mMyLeakyString = [[NSString alloc] initWithUTF8String:  
  17. “Look, another alloc, but no release for first one!”];  
  18. }  
  19.  
  20. // Leaky excerpts – see GitHub for complete source  
  21.  
  22. LeakyClass::LeakyClass()  
  23. {  
  24. mLeakedObject = new LeakedObject();  
  25. }  
  26.  
  27. LeakyClass::~LeakyClass()  
  28. {  

我會先在 Debug 模式編譯InstrumentsTest,并在 iPhone 上運行。完成這步,我會啟動 Instruments。

詳解iPhone應用中內存泄露使用Leaks工具指引

當你啟動 Instruments,你可以從一堆 Instruments 工具里選擇你需要的。在左手邊選擇 iPhone,在右手邊的圖標里雙擊“Leaks”工具:

詳解iPhone應用中內存泄露使用Leaks工具指引

之后你會看到下邊的窗口:

詳解iPhone應用中內存泄露使用Leaks工具指引

請確保 iPhone 已經連接到了你的電腦,在這個窗口的左上角,你會看到一個下拉菜 單,寫著“Launch Executable”。單擊它,并確保選中的是你 iPhone(而不是你的電腦)作為活動設備。然后移動到“Launch Executable”,你可以看到一個包含了所有已安裝 iPhone 程序的列表。找到你希望運用“Leaks”工具的程序(本例中是 InstrumentsTest)并單擊它。

詳解iPhone應用中內存泄露使用Leaks工具指引

你已經準備好了。單擊紅色的“Record”按鈕,它會啟動程序并開始記錄程序里的每個內存分配操作。它會每10秒自動地檢測內存泄露。

詳解iPhone應用中內存泄露使用Leaks工具指引

你 可以改變多少時間自動檢測一次,你也可以手動進行檢測(檢測內存泄露的時候程序會停頓大約3-5秒鐘,如果你想邊進行測試邊進行內存檢測的話,這種停頓將 會干擾到你)。我一般是設置成手動控制,在我需要的時候才單擊“Check for leaks”按鈕(例如:在loading新的游戲模式之后檢測一下,在退出游戲返回 MM 的時候檢測一下)。單擊“Leaks”,并使用右上角的 View->Detail 按鈕來設置和查看選項值,在這個例子里,我將其設置成 auto。

詳解iPhone應用中內存泄露使用Leaks工具指引

程序在運行一段時間之后,自動內存檢測將會發現兩處內存泄露。太棒了!現在該干什么呢?

詳解iPhone應用中內存泄露使用Leaks工具指引

Extended Detail 視圖

Instruments 非常懶,它不會明顯地指出下一步該干什么。你需要注意的是窗口底部的那一排按鈕。看見兩個矩形組成的那個按鈕了嗎?講你的鼠標停留在上邊,它會提示“Extended Detail View”,如圖:

詳解iPhone應用中內存泄露使用Leaks工具指引

單擊這個按鈕,右邊將會彈出一個窗口,里邊提供了各種關于內存泄露的詳細信息。單擊一個內存泄露,Extended Detail 視圖將會顯示泄露的內存代碼的完整調用堆棧。在我們上邊的例子中,單擊第一個內存泄露提示,它發生在 [NSString initWithUTF8String]。如果你選中調用堆棧里的高亮步驟,你會看到程序最后一次調用是

  1. [InstrumentsTestViewController viewDidLoad] 

雙擊 Extend Detail 視圖中的某行,它會打開 XCode 窗口并顯示出問題的代碼,這是非常棒的功能。

詳解iPhone應用中內存泄露使用Leaks工具指引

在本例中,第一次 NSString 分配的時候出現了泄露,你需要做一些處理。這是個非常簡單的例子,但找到為什么會發生泄露則要麻煩些。讓我們仔細看一下例子。在 viewDidLoad 當中,我們為字符串分配到了內存,如下所示:

  1. mMyLeakyString = [[NSString alloc] initWithUTF8String:”I’m a leaky string.”]; 

在 dealloc 當中我們用如下方式來釋放

  1. [mMyLeakyString release]; 

你的直覺可能是這樣不會發生泄露,但搜索代碼中所有用到了 mMyLeakyString 的地方,在 doSomethingNow 中,它是這樣用的:

  1. mMyLeakyString = [[NSString alloc] initWithUTF8String:  
  2. “Look, another alloc, but no release for first one!”]; 

注意,我們聲明了一個新的字符串,并且將 mMyLeakyString 指向了它。這里的問題是我們沒有在更改 mMyLeakyString 的指向前釋放它原 來指向的內存。所以原始的字符串依然在堆中,并且我們沒有辦法釋放這部分內存。dealloc 里的 release 操作實際釋放的是我們在 doSomethingNow 中聲明的字符串所占內存,因為這才是指針所指。

為了修復這個問題,我們可以把 doSomethingNow 改成下邊的代碼:

  1. - (void) doSomethingNow  
  2. {  
  3. [mMyLeakyString release];  
  4. mMyLeakyString = [[NSString alloc] initWithUTF8String:  
  5. “Look, another alloc, but released first one!”];  

這段代碼做的是在我們指定 mMyLeakyString 到新的字符串前釋放第一個字符串所占內存。重新編譯運行程序,你會看到只有一個內存泄露。當然,在項目中可能有更好的方式來處理 NSString,但如果你這樣處理的話可以修復這個泄露問題。

讓我們看看第二個泄露問題。單擊泄露提示看什么導致了內存泄露。發現這個泄露來自于 LeakyClass::LeakyClass() 構造函數,如圖:

詳解iPhone應用中內存泄露使用Leaks工具指引

在調用堆棧中雙擊它,出問題的代碼將會再次出現在 XCode 中,如圖:

詳解iPhone應用中內存泄露使用Leaks工具指引

我們看到在構造函數里聲明了一個新的 LeakedObject 對象,但是析構函數沒有刪除,這樣不好。對于每一個 new 操作,都需要有與之對應的 delete 操作。所以我們把析構函數改變成下邊的樣子:

  1. LeakyClass::~LeakyClass()  
  2. {  
  3. if (mLeakedObject != NULL)  
  4. {  
  5. delete mLeakedObject;  
  6. mLeakedObject = NULL;  
  7. }  

重新編譯運行,沒有內存泄露了!

我選擇這兩個例子,雖然非常簡單,但他們展示了 Instruments 可以用來追蹤 Object-C 和 C++ 中的內存泄露。

修復你的內存泄露問題吧,記住,沒有內存泄露的程序才是一個好程序。

小結:iPhone應用內存泄露使用Leaks工具指引的內容介紹完了,希望通過本文的學習能對你有所幫助!

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

2011-07-21 17:45:44

iPhone 內存泄露 Leaks

2010-11-05 13:02:58

內存iPhone

2011-08-17 15:10:21

iPhone開發Web視圖

2011-08-10 17:37:00

iPhoneASIHTTPRequ

2011-08-02 17:27:06

iPhone應用 剪切技巧

2011-06-03 10:19:59

iphone Objective-

2011-07-06 17:48:30

iPhone Xcode 模擬器

2011-08-12 14:33:06

iPhone緩存文件

2011-08-15 11:37:20

iPhone開發Mask

2011-09-15 15:58:37

iPhone應用Quick Snap拍攝工具

2011-08-03 17:18:58

iPhone UILabel UISlider

2011-08-09 14:08:51

iPhoneHTTP請求協議

2011-08-19 14:27:29

iPhone開發

2011-08-18 15:56:08

iPhone開發內存

2011-07-26 16:33:56

iPhone Delegate

2011-07-27 10:16:41

iPhone SQLite 數據庫

2016-09-12 16:01:28

Android內存泄露內存管理

2011-08-11 13:35:28

iPhoneASIHTTPRequHTTP

2012-03-02 14:20:46

JavaJVM

2010-08-12 09:30:08

Flex內存泄露
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: www.亚洲国产精品 | 国产精品一区二区视频 | 日韩一区二区三区在线观看 | 久久99蜜桃综合影院免费观看 | 欧美二区在线 | 欧美在线视频网 | 亚洲高清一区二区三区 | 久久精品—区二区三区 | 成人三级电影 | 久草青青草| 天天天操天天天干 | 欧美精品一区三区 | 成人影院网站ww555久久精品 | 成年人免费网站 | 亚洲一区二区久久 | 日韩精品久久一区二区三区 | 久久久91 | 精品免费国产 | 成年人网站免费视频 | 亚洲国产高清高潮精品美女 | 91亚洲国产 | 日本午夜网| 国内精品在线视频 | 免费三级网站 | 欧美精品欧美精品系列 | 国产精品精品久久久 | 欧美国产亚洲一区二区 | 在线亚洲人成电影网站色www | 综合久| 亚洲欧美日韩久久 | 午夜男人天堂 | 资源首页二三区 | 粉嫩国产精品一区二区在线观看 | 欧美日韩一区二区三区在线观看 | 一区二区三区国产视频 | 精品国产乱码久久久久久蜜退臀 | 在线观看成人免费视频 | 久在线观看 | 欧美极品视频在线观看 | 久久精品日 | 国产精品自拍啪啪 |