我有一個洪水填充功能:爲什麼我收到了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
(無論是0
或1
)。這只是一個一維數組,它通過將ySpot
乘以120
(我的網格寬度)來模擬二維數組。我檢查了gridCount
,它等於9600
。
但是,我得到一個exc_bad_access
在[[theGrid objectAtIndex:(xSpot+ySpot*120)] getValue:&gridValue]
。我檢查我的xSpot
和ySpot
當發生這種情況,我知道(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
我想如果你超出界限,你會得到一個界外例外;訪問不錯。我懷疑網格或你從中拉出的對象是假的(已經發布)。將其分成多行進行確認;並在您的調試設置中打開「殭屍」。 – Dave
我把它分成兩行,發現錯誤在gridValue = [object intValue];我還在我的方案的診斷選項卡中啓用了殭屍。不知道如何真正檢查殭屍。 – user2012741
當殭屍被啓用時,操作系統將您的指針設置爲NSZombie對象,而不是離開'懸空'指針。後來,如果你在嘗試訪問被釋放後的對象時,你會得到一個很好的運行時錯誤。 (即,你快速崩潰。)如果這解決了你的問題,讓我知道,我會將我的評論移動到答案框。 – Dave