2011-11-02 70 views
2

我的遊戲是在cocos2d 0.99.5中創建的。我測試了它並在App Store中發佈了。程序在iOS5中崩潰,在iOS4中正常?

當我將iPhone從iOS4.3.3更新到iOS5.0後,我的遊戲崩潰頻繁。

*終止應用程序由於未捕獲的異常 'NSGenericException',原因是: '*收藏< __NSArrayM:0x668a540>突變而被列舉。'

*第一擲調用堆棧:

(0x30bed8bf 0x37d921e5 0x30bed3e3 0x5cd1 0x2f837 0xa577b 0xae245 0xcc29d 0xcdfed 0x322ee423 0x322ee379 0x358d3f93 0x31e81891 0x30bb6f43 0x30bc1553 0x30bc14f5 0x30bc0343 0x30b434dd 0x30b433a5 0x33771fed 0x32bb5743 0x2c65 0x2bf8)

終止叫做拋出一個異常

這次崩潰破壞了內存堆棧。我添加了「objc_exception_throw」斷點後。我發現崩潰發生在{} NSArray循環中。

我不知道爲什麼這次崩潰只發生在iOS5.This遊戲的測試已準備好新版本和新的內容。我無法解決這個問題,並感到沮喪。

有人可以幫助我嗎?

====================================

更新(11/3/11):

NSMutableArray *monsterArray;   // monsters information 

    [gameObject schedule:@selector(gameSchedule:) interval:1.0/30]; // schedule for everything update 

- (void) gameSchedule:(ccTime)_dt 
{ 
    ... 
    for (Monster *mon in monsterArray) // here causing crash 
    { 
     ... 
     // check every monster state 
    } 
} 

我不知道的cocos2d thoroughly.In我的遊戲項目的線程模塊,也有一些CCAction做序列操作:

id action = [CCSequence actions: 
        ..., 
        [CCCallFunc actionWithTarget:self selector:@selector(doSth:)], 
        nil]; 
    [object runaction:action]; 

- (void)doSth:(id)_sender 
{ 
    //some selector modified object value in monsterArray 

    //some selector deleted or added object in monsterArray 
} 

無論cocos2d的創造一個新的線程doSth:並導致崩潰? 有很多選擇器在我的遊戲項目中做了這些動作(修改,刪除和添加)。 我該如何解決這個問題?

============================================== =====================

更新(11年11月4日):

@Amorya 我檢查關於NSCopying協議文件。

[monsterArray copy]在[monsterArray copy]中返回一個新的NSMutableArray.New對象,像CCMove \ CCSequence \ CCJump會導致正確的過程嗎?我不明白。請解釋一下。

@Brad Larson 我添加了一個符號斷點「objc_exception_throw」,並找出導致崩潰的{} NSMutableArray循環。

+2

你可以請郵編崩潰的代碼。 – 0x8badf00d

+2

同意,並檢查錯誤消息,其中指出您在枚舉(迭代)時修改NSMutableArray。這是非法的,可能僅僅是因爲使用iOS 5或Xcode 4.2附帶的更新編譯器版本,現在會創建一個運行時錯誤,而不是默默地創建一個邏輯錯誤,您可能迄今錯過了這個錯誤。 – LearnCocos2D

+0

確定原因的簡單方法是爲所有Objective-C異常添加一個斷點,並在啓用了斷點的調試器下運行應用程序。這應該停止在你的怪物陣列發生變異的地方,並告訴你觸發的是什麼。可能性是,這是一個線程問題,由於時序或執行順序略有不同,最終將在5.0版本中暴露給您的設備。 –

回答

2

改變這一行

for (Monster *mon in monsterArray) 

for (Monster *mon in [monsterArray copy]) 

不允許你在使用快速列舉(如LearnCocos2D在評論中提及)在它迭代修改數組。複製數組是修正這個問題的最簡單方法,而不需要改變代碼的邏輯。

如果您不使用ARC,那麼您還需要在其中輸入autorelease

+0

我查了關於NSCopying協議的文檔。 [monsterArray copy]在[monsterArray copy]中返回一個新的NSMutableArray.New對象,像CCMove \ CCSequence \ CCJump會導致正確的過程?我不明白。請解釋一下。 – Hes

+0

它返回另一個數組,其中包含相同的對象。試試看看它是否有效:) –

+0

非常感謝,Amorya!有用! – Hes

相關問題