2012-12-19 119 views
1

我開發了一個應用程序,現在我使用儀器來查看內存使用情況。我在理解對象的保留/釋放過程時遇到問題。這是儀器說什麼:iOS - 內存和保留/釋放問題

http://f.cl.ly/items/1Y2Z1e2K3e3Y3e1I1z26/Schermata%202012-12-19%20alle%2011.18.51.png

保留計數增加,當添加我的對象到一個數組,當我將其添加在我看來,當我從陣列中起飛。 因此,當我使用removeFromSuperview時,對象retainCount將永遠不會爲零,因此對象不會釋放內存。編輯1: 我忘了說我正在使用ARC。

編輯2: 我描述正是發生: 我在一個叫NKLevelGenerator類一起創建對象的其他對象。進入它,我分配NKIngredient s,然後我將全部添加到將返回的NSArray。這裏的每一個對象的保留數爲2。在我NKLevelVC,我ViewController,我用這個指令:

[level addObjectsFromArray:[levelGenerator level1WithDelegate:self ciotola:ciotola bagliore:bagliore difficulty:NKDifficultyHard]]; 

對象levelNSMutableArrayallocviewDidLoadinit。 在這裏,我呼籲執行此操作的另一種方法:

- (void)insertInArrayRandomly { 
    for (int i=0; i<[level count]; i++) { 
     [ingredienti insertObject:[level objectAtIndex:[[indexes objectAtIndex:i]integerValue]] atIndex:i]; 
    } 
} 

對象ingredienti是另一個NSMutableArrayallocviewDidLoadinitindexes是一個NSInteger的數組,其中包含隨機索引以隨機提取NKIngredient對象。 那麼我這樣做:

NKIngredient *ing = [ingredienti objectAtIndex:index]; 
[[self view] insertSubview:ing belowSubview:navBar]; 
[ing animateIngredient]; 
[ingredienti removeObject:ing]; 
+0

以下是圖像:http://f.cl.ly/items/1Y2Z1e2K3e3Y3e1I1z26/Schermata%202012-12-19%20alle%2011.18.51。png –

回答

1

之前看進入儀器你有沒有試過你的代碼的靜態分析?這可能有助於解決簡單的內存問題。

但首先要檢查的是:您是否遵循黃金法則

黃金規則是:對於每一個alloccopyretain你必須使用一個,只有一個,releaseautorelease

這是沒有ARC的內存管理最重要的規則。所以,你的對象被數組保留的事實不關你的事情,只要記住你保留,分配或複製了什麼,然後釋放它。

PS:接下來的時間,你的代碼會比儀器屏幕截圖大有幫助。

+0

我在這個項目中使用ARC –

+0

所以你不應該使用'retain'和'release' ......靜態分析說什麼? – Zaphod

+0

靜態分析說沒有內存泄漏!但是這個對象留在記憶中,我通過儀器看到了這一點。 –

0

第一:使用儀器,看是否有效有內存泄漏,有一個爲這個目的而作出的工具,並在那裏你泄漏內存它會告訴你。第二:它取決於視圖上有多少對象[保留]。如果你添加到一個數組,它保留看法,但如果你沒有在創建視圖的方法釋放它,當你從陣列釋放來看,計數將仍然是1