2011-02-04 58 views
0

我有一個帶有幾個視圖元素的NSMutableArray。EXC_BAD_ACCESS for NSMutableArray

我從視圖層次中刪除視圖,然後檢查數組的保留數,它返回1.然後我發送[array release],但代碼使用EXC_BAD_ACCESS轉儲。

我看到數組中有元素,但仍然是代碼轉儲。

這是我在調試過程中發現的。數組中有100個對象(數組返回100),而在調試器上看到的內容返回元素的「超出範圍」。此外,由於該陣列是在視圖層次,下面的代碼減少了兩個保留計數:

for (Liv *view1 in viewArray){ 
    NSLog(@"view count = %d", [view1 retainCount]); 
    [view1 removeFromSuperview]; 

    NSLog(@"view count = %d", [view1 retainCount]); 
} 
+0

甚至[數組removeAllObjects]轉儲 – DKV 2011-02-04 15:53:15

回答

0

你有沒有retainalloc的陣列?如果沒有,你不應該發送它release

EXC_BAD_ACCESS表示您正在向已發佈的對象發送消息。您(或某處的某個代碼)會在您發送release(或​​)的代碼部分之前發佈它。

基本上,如果你的保留和釋放是平衡的,你不會得到這個錯誤。我們需要看到一些代碼,然後才能提供比通用建議更多的東西。

使用NSLog()retainCount不是調試此類錯誤的最簡單方法。假設你使用的是Xcode 3.2.6,然後嘗試通過Run> Run with Performance Tool> Zombies運行你的代碼。這應該給你一個很好的指針,指出你的代碼的哪一部分有問題。

+0

是的我分配初始化數組 – DKV 2011-02-04 15:56:16

3

不要使用retainCount

這種調試沒用,您正在框架的視圖層次結構中處理視圖。可能有多種原因導致保留計數增加2倍,10倍或42倍。

從迄今爲止公佈的證據來看,這似乎是一個非常直接的內存管理問題。

首先,使用「構建和分析」讓llvm靜態分析器檢查您的代碼。修復它識別的任何問題。

接下來,如何分配數組?你在哪裏存儲它?發佈聲明或操作數組的所有代碼行。

最後,正如保羅所說,打開殭屍,看看會發生什麼。

這不是一個保留/發佈問題,但目前還沒有任何證據可以表明。