0

Oui, donc celui-ci à travers moi ou une boucle pendant un moment jusqu'à ce que je devine ce qui se passait. Avec Apple qui publie la version finale de Xcode aujourd'hui et iOS 4 qui sortira hier, j'ai finalement commencé à envisager de transférer mes applications vers iOS 4.Mauvaise erreur d'accès dans le jeu Cocos2D en SKD 4, mais pas 3

J'ai donc téléchargé le nouveau SDK et je me suis mis au travail. Après avoir travaillé un peu sur mon application, imaginez ma surprise quand j'ai eu une mauvaise erreur d'accès, (en essayant de parler à un objet désalloué). Je déteste ces erreurs, si difficile à comprendre ce qu'il faut faire. Donc, j'ai passé les 45 dernières minutes à essayer de trouver quel objet j'avais libéré. Je ne pouvais pas me souvenir de ce que j'avais changé, et les messages d'erreur ne m'aidaient pas. Je NSZombies ENABLED (Zombies !!!) et a obtenu cette erreur:

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

Ce qui est à peu près aussi utile que cela puisse paraître. Je suis dans Cocos2D, donc je pense qu'on touche quelque chose qui n'existe plus? Mais je ne pouvais pas trouver quelque chose comme ça dans mon code. Donc, sur un coup de tête, j'ai utilisé ma version antérieure de Xcode. Compilé et installé sur le simulateur exécutant iOS 3.0. J'ai bien travaillé. Comme un charme, comme je l'avais fait.

Alors maintenant, ma question est, qu'est-ce qui se passe ici. Quelle est la différence entre SDK 4 et 3 qui provoquerait une erreur Bad Exc? Des idées? Ou peut-être que c'est un problème avec cocos2d et qui doit être mis à jour?

Edit: J'ai fait quelques déconner et a trouvé que, en supprimant cette ligne de code:

- (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; 
} 

Ensuite, il fonctionne. Donc, il semble que le gestionnaire CCTargedTouch est lié à mon sprite (qui est ensuite retiré quand je le touche) et quelqu'un ne fonctionne pas tout ... Cependant, j'ai besoin des sprites pour être enlevé (ou au moins disparaître, mais je vouloir être consciencieux), alors comment puis-je faire cela?

Merci!

Répondre

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

Cela est très utile. Il vous dit exactement ce qui s'est mal passé; une instance sur-libérée de CCTargetedTouchHandler a été invoquée par une méthode.

projet basé Chaque Cocos2d a la source complète intégrée et si vous utilisez Instruments pour suivre les zombies, vous pouvez voir le backtrace exact où l'objet a été créé, conservé et/ou libéré.

Cela peut être un bug dans Cocos2d, mais je doute qu'il lise le code. Cela ressemble plus à une sur-version dans votre application qui ne s'est pas déclenchée avant, mais maintenant. Soit quelque chose n'est pas retenu qui devrait l'être, quelque chose n'est pas ce qui devrait être et/ou vous passez des choses entre les threads d'une manière dangereuse.

+0

Je vais marquer cela comme une réponse, mais comme cela m'a aidé dans le débogage, mais je n'ai jamais trouvé le bug réel. J'ai utilisé NSZombies dans Instruments et tout ce qui était possible pour localiser le bogue, mais finalement je l'ai laissé comme ça, un bug. Et a fait un petit hack pour le contourner (faire une chose sur OS 4, mais une chose différente sur OS 3). Cela fonctionne, mais je souhaite qu'il y ait une meilleure solution ... –