我的遊戲是在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循環。
你可以請郵編崩潰的代碼。 – 0x8badf00d
同意,並檢查錯誤消息,其中指出您在枚舉(迭代)時修改NSMutableArray。這是非法的,可能僅僅是因爲使用iOS 5或Xcode 4.2附帶的更新編譯器版本,現在會創建一個運行時錯誤,而不是默默地創建一個邏輯錯誤,您可能迄今錯過了這個錯誤。 – LearnCocos2D
確定原因的簡單方法是爲所有Objective-C異常添加一個斷點,並在啓用了斷點的調試器下運行應用程序。這應該停止在你的怪物陣列發生變異的地方,並告訴你觸發的是什麼。可能性是,這是一個線程問題,由於時序或執行順序略有不同,最終將在5.0版本中暴露給您的設備。 –