Ошибка неверного доступа в игре Cocos2D в SKD 4, но не 3 - PullRequest
0 голосов
/ 22 июня 2010

Да, так что это через меня или какое-то время, пока я не выясню, что происходит. Сегодня, когда Apple выпустила финальную версию Xcode, а вчера вышла iOS 4, я наконец начал изучать возможность переноса своих приложений на iOS 4.

Итак, я скачал новый SDK и приступил к работе. Немного поработав над моим приложением, представьте мое удивление, когда я получил ошибку доступа (попытка поговорить с освобожденным объектом). Я ненавижу эти ошибки, так сложно понять, что делать. Итак, я потратил последние 45 минут, пытаясь найти объект, который я освободил. Я не мог вспомнить, что я изменил, и сообщения об ошибках не помогали. Я включил NSZombies (Зомби !!!) и получил эту ошибку:

2010-06-22 15:38:28.655 ProjectPidgey[17783:207] *** -[CCTargetedTouchHandler claimedTouches]: message sent to deallocated instance 0xd834b30

Что примерно так же полезно, как кажется. Я нахожусь в Cocos2D, поэтому я думаю, что что-то трогается, что больше не существует? Но я не смог найти ничего подобного в своем коде. Итак, по своей прихоти, я использовал мою старую версию Xcode. Скомпилировал и установил его на симуляторе под управлением iOS 3.0. Работал нормально. Как очарование, так же, как я сделал это.

Итак, мой вопрос: что здесь происходит? В чем разница между SDK 4 и 3, которая может вызвать ошибку Bad Exc? Есть идеи? Или, возможно, это проблема с cocos2d, которую нужно обновить?

Редактировать: Я немного повозился и обнаружил, что, удалив эту строку кода:

- (BOOL)ccTouchBegan:(UITouch *)touch withEvent:(UIEvent *)event
{
    CGPoint touchPoint = [touch locationInView:[touch view]];
    touchPoint = [[CCDirector sharedDirector] convertToGL:touchPoint];
    if ( ![super containsTouchLocation:touch] ) return NO;
    [self.engine playerHitRedDot:self];
    //[self.parent removeChild:self cleanup:YES]; //REMOVED THIS LINE
    return YES;
}

Тогда это работает. Таким образом, похоже, что обработчик CCTargedTouch связан с моим спрайтом (который затем удаляется, когда я к нему прикасаюсь), и у кого-то все не получается ... Однако мне нужно удалить спрайты (или, по крайней мере, исчезнуть, но я хочу быть памятью добросовестной), так как я могу это сделать?

Спасибо!

1 Ответ

1 голос
/ 23 июня 2010
2010-06-22 15:38:28.655 ProjectPidgey[17783:207] *** -[CCTargetedTouchHandler claimedTouches]: message sent to deallocated instance 0xd834b30

Это очень полезно.Это говорит вам точно, что пошло не так;для перевыпущенного экземпляра CCTargetedTouchHandler был вызван метод.

В каждом проекте, основанном на Cocos2d, встроен полный исходный код, и если вы используете инструменты для отслеживания зомби, вы можете увидеть точный обратный след того, гдеобъект был создан, сохранен и / или выпущен.

Возможно, это ошибка в Cocos2d, но я сомневаюсь, что он читает код.Это выглядит как переиздание в вашем приложении, которое раньше не вызывало сбой, но делает это сейчас.Либо что-то не сохранено, что должно быть, что-то не nil d, что должно быть, и / или вы передаете вещи между потоками небезопасным способом.

...