2011-05-11 80 views
0

我正在創建一個iPhone應用程序。遇到內存問題,我開始使用儀器來追蹤任何內存問題。我遇到了一些奇怪的行爲,導致我認爲我要麼是誤用了儀器,要麼就是誤讀了它的數據。瞭解iOS儀器

這些移入和移出一個位置時記錄的LiveBytes值:

**Expensive Location-** 
World (12 MB) 
Loc (27 MB) 
World (13 MB) 
Loc (28 MB) 
World (14 MB) 
-Crash 

**Cheap Location-** 
World (12 MB) 
Loc (23 MB) 
World (13 MB) 
Loc (24 MB) 
World (14 MB) 
-Crash 

注意如何我還是崩潰,即使便宜的位置的記憶已經沒有在附近昂貴的位置的存儲器。任何人都可以幫助我嗎?

+0

我很困惑 - 在這種情況下,什麼是便宜的位置或昂貴的位置? – Rup

+0

昂貴的位置使用了大量的內存,便宜的位置使用的並不多。 – TurqMage

+1

內存使用量與崩潰有什麼關係?什麼是崩潰?你幾乎肯定會過度釋放一些東西(這是iOS崩潰的頭號原因)。 –

回答

1

我不確定這是否與您遇到的問題有關,但我希望它有幫助:我最近正在跟蹤應用程序的內存佔用情況,我注意到即使將dealloc消息發送到視圖控制器在UINavigator控制器上點擊「返回」後,我仍然有幾十個活動對象從此操作中遺留下來(您可以在樂器應用程序的「分配」面板中看到這一點)。爲了解決這個問題我用的幾樣東西混合:

首先,我增加了以下三種方法的NSLog我的自定義子視圖的保留計數器(這裏發現因此在iOS4 - fast context switching):

#pragma mark - RETAIN DEBUG MAGIC 
// ----------------------------------------------------------------------------- 

- (id)retain 
{ 
    NSLog(@"retain \t%s \tretainCount: %i", __PRETTY_FUNCTION__ , [self retainCount]); 
    return [super retain]; 
} 
- (void)release 
{ 
    NSLog(@"release \t%s \tretainCount: %i", __PRETTY_FUNCTION__ , [self retainCount]); 
    [super release]; 
} 
- (id)autorelease 
{ 
    NSLog(@"autorelease \t%s \tretainCount: %i", __PRETTY_FUNCTION__ , [self retainCount]); 
    return [super autorelease]; 
} 

然後,我隔離了每個視圖構建塊,只留下一個簡單的任務(例如,將UIButton作爲子視圖加載),然後返回到儀器應用程序以跟蹤活動對象(在Xcode中產品>配置文件下)並禁用所有對象'NS','CF'和'Malloc'前綴(你可以點擊'Allocations'選項卡旁邊的小按鈕)。在此之後,在右下方的窗格中選擇「調用樹」並繼續鑽取,直到我發現一些地方櫃檯上升的地方,在我前後導航時。

請注意,您可以雙擊符號查看與處理器調用相關的詳細信息。此外,點擊小圖標將彈出一個突出顯示的呼叫的回溯圖。

當看回溯時,你會看到其中一些人有一個小圖標,描繪了一個人在一個框架上(這些圖標旁邊的文字作爲一個視覺提示明顯較暗)。雙擊這些將帶你到你的代碼負責這個電話的行。

以下是可能給你一隻手更多瞭解儀器幾個環節:

注: 在結束在我的旅程中,我所要做的就是在添加t之後發佈我的觀點對他們的「超級」觀點下定決心,以確保他們將被分配。即

[[self view] addSubView:aButton]; 
[aButton release];