2013-02-02 61 views
1

我有一個洪水填充功能:爲什麼我收到了objectAtIndex EXC_BAD_ACCESS錯誤在我floodfill算法

-(void) fillArea :(int) fillNum x:(int) xSpot y:(int) ySpot 
{ 
    int gridValue = 1; 
    int gridCount = [theGrid count]; 
    [[theGrid objectAtIndex:(xSpot+ySpot*120)] getValue:&gridValue]; 

    if (gridValue != 0) { 
     return; 
    } 
    [theGrid replaceObjectAtIndex:(xSpot + ySpot*120) withObject:[NSNumber numberWithInt:fillNum]]; 
    [self fillArea:fillNum x:(xSpot+1) y:(ySpot)]; 
    [self fillArea:fillNum x:(xSpot+1) y:(ySpot-1)]; 
    [self fillArea:fillNum x:(xSpot) y:(ySpot-1)]; 
    [self fillArea:fillNum x:(xSpot-1) y:(ySpot-1)]; 
    [self fillArea:fillNum x:(xSpot-1) y:(ySpot)]; 
    [self fillArea:fillNum x:(xSpot-1) y:(ySpot+1)]; 
    [self fillArea:fillNum x:(xSpot) y:(ySpot+1)]; 
    [self fillArea:fillNum x:(xSpot+1) y:(ySpot+1)]; 

    return; 
} 

theGrid是整數的NSMutableArray(無論是01)。這只是一個一維數組,它通過將ySpot乘以120(我的網格寬度)來模擬二維數組。我檢查了gridCount,它等於9600

但是,我得到一個exc_bad_access[[theGrid objectAtIndex:(xSpot+ySpot*120)] getValue:&gridValue]。我檢查我的xSpotySpot當發生這種情況,我知道(xSpot+ySpot*120) < 9600每次。所以我知道這不是我試圖訪問一個索引在我的數組之外的對象。

Futhermore,在我的蜱功能我跑的代碼:

int gVal = 1; 
int gIndex = 0; 
while (gIndex < [theGrid count]) { 
    [[theGrid objectAtIndex:gIndex] getValue:&gVal]; 
    gIndex += 1; 
} 

我沒有得到一個exc_bad_access錯誤。請幫我弄清楚爲什麼我得到一個exc_bad_access錯誤。

編輯:

我分裂[[theGrid objectAtIndex:(xSpot + ySpot * 120)]的getValue:& gridValue];成:

id object = [theGrid objectAtIndex:(xSpot+ySpot*widthInGridSize)]; 
gridValue = [object intValue]; 

我仍然獲得EXC_BAD_ACCESS和它說,它是就行: gridValue = [對象的intValue];

所以我認爲這意味着對象已經被釋放?我不明白這是可能的。我認爲整合並不需要以任何方式保留,因爲它們只是整數。另外我想添加一個對象到數組會自動保留它,爲什麼我的int會被釋放。

在調試部分對象的值等於所述:(_NSCFNumber *)0x005aec80(INT)0

+1

我想如果你超出界限,你會得到一個界外例外;訪問不錯。我懷疑網格或你從中拉出的對象是假的(已經發布)。將其分成多行進行確認;並在您的調試設置中打開「殭屍」。 – Dave

+0

我把它分成兩行,發現錯誤在gridValue = [object intValue];我還在我的方案的診斷選項卡中啓用了殭屍。不知道如何真正檢查殭屍。 – user2012741

+0

當殭屍被啓用時,操作系統將您的指針設置爲NSZombie對象,而不是離開'懸空'指針。後來,如果你在嘗試訪問被釋放後的對象時,你會得到一個很好的運行時錯誤。 (即,你快速崩潰。)如果這解決了你的問題,讓我知道,我會將我的評論移動到答案框。 – Dave

回答

0

按照意見 - 這實際上不是一個出界的問題,而是物體你」重新拔出'theGrid'是假的(已經發布)。將其分成多行進行確認;並在您的調試設置中打開「殭屍」。乾杯!

相關問題