Моя игра создана в cocos2d 0.99.5. Я протестировал ее и выпустил уже в App Store.
После того, как я обновил свой 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)
Terminate называется бросать исключение
Это сбой разбитого стека памяти. После того, как я добавил точку останова "objc_exception_throw".Я обнаружил сбой в цикле {} NSArray.
Я не знаю, почему произошел сбой только в iOS5.Этот тест игры готов к новой версии и новому контенту. Я не могу решить эту проблемуи чувствую себя подавленным.
Может ли кто-нибудь мне помочь?
===================================
обновление (3.11.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. В моем игровом проекте есть некоторые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: и вызывает ли это сбой?Есть много селекторов, которые сделали эти действия (изменить, удалить и добавить) в моем игровом проекте.Как я могу решить эту проблему?
========================================================================
обновление (04.11.11):
@ Amorya Я проверил документы оПротокол NSCopying.
[monsterArray copy] возвращает новый объект NSMutableArray.New в [monsterArray copy] запускает действия, которые как CCMove \ CCSequence \ CCJump будут вызывать правильный процесс? Я не понимаю. Пожалуйста, объясните.
@ Брэд Ларсон Я добавил символическую точку останова "objc_exception_throw" и выяснил, что цикл for {} NSMutableArray вызвал сбой.