我有代碼的Objective-C中一個非常簡單的線條時:EXC_BAD_ACCESS在iPhone上使用「OBJ =零
if ((selectedEntity != nil) && [selectedEntity isKindOfClass:[MobileEntity class]])
有時無緣無故我可以告訴大家,遊戲崩潰在這條線代碼與EXC-BAD-ACCESS通常似乎是關於什麼時候某些東西從遊戲區域中刪除的時間,所以我猜想是 selectedEntity會被解除分配,那麼結果就是這樣。不可能選擇退出的實體(但是誰知道,也許這在我的代碼中實際上並不是這樣)......我之前專門檢查是否有是 selectedEntity訪問它意味着我不應該在這裏遇到任何問題。 Objective-C應該支持布爾短期引用,但它似乎不是EDIT:看起來像短路與問題無關。
另外,我在這個代碼塊中放了一個@ try/@ catch,因爲我知道它每隔一段時間就會爆炸一次,但這似乎被忽略了(我猜EXC-BAD-ACCESS不能抓住)。
所以基本上我想知道是否有人知道我可以抓住它並拋出它的方式(因爲只要它不會造成遊戲崩潰,我不在意這個錯誤),或者可以解釋爲什麼它可能正在發生。我知道Objective-C用「nil」值做奇怪的事情,所以我猜測它指向一個奇怪的空間,它既不是對象指針也不是零。
編輯:只是爲了澄清,我知道下面的代碼是錯誤的,這是我猜測發生在我的程序中。我在問,這是否會導致一個問題 - 的確如此。 :-)
編輯:看起來像有一個邊緣的情況下,可以讓你選擇一個實體之前,它被擦除。因此,它出現在代碼的進展是這樣的:
selectedEntity = obj;
NSAutoreleasePool *pool = ...;
[obj release];
if (selectedEntity != nil && etc...) {}
[pool release];
所以我猜測,因爲自動釋放池尚未公佈,對象不是零,但其保留計數爲0,所以它的無論如何不允許訪問......或者沿着這些路線的東西?
另外,我的遊戲是單線程的,所以這不是線程問題。
編輯:我解決了這個問題,有兩種方法。首先,我不允許選擇該邊緣案例中的實體。其次,而不只是調用[實體removeObjectAtIndex:I](代碼刪除將被刪除的任何實體),我把它改爲:
//Deselect it if it has been selected.
if (entity == selectedEntity)
{
selectedEntity = nil;
}
[entities removeObjectAtIndex:i];
只要確保你在分配零的變量就像jib建議的那樣,你同時釋放它。
-removeObjectAtIndex:將遞減保留計數,如果它達到零,則釋放該對象。殭屍會檢測到這一點。因此,您在上次編輯中指定爲零可修復問題。 – bbum 2009-08-31 20:46:29