2010-10-31 6 views
0

J'essaie de résoudre mon premier problème EXC_BAD_ACCESS. Je vois de nombreux tutoriels et blogs que je peux utiliser Zombies pour m'aider à comprendre où je me trompe. Mais je ne pense pas que mes zombies fonctionnent, et je ne comprends absolument rien de la console.Impossible de faire fonctionner les Zombies en XCode

Quand je commence le programme que je vois ceci: This GDB was configured as "x86_64-apple-darwin".Setting environment variable "NSZombieEnabled" to null value.

Finalement, je vois quelques traces NSLog je puis:

Program received signal: “EXC_BAD_ACCESS”. 

aucune aide. Des idées? Je soupçonne que même avec les zombies qui travaillent, il ne sera pas en mesure de me dire où le mauvais accès est arrivé. Objectif C me rend triste - Cela aurait pris 3 secondes dans ActionScript :(


Vous dites que le crash est ici (modifier la question la prochaine fois):

- (IBAction) toggleView{ 
if(switchableView.subviews.count != 0) 
    [[switchableView.subviews objectAtIndex:0] removeFromSuperview]; 
UIViewController* newView = (viewSelector.selectedSegmentIndex == 0) ? [Login new] : [UserRegistration new]; 
[switchableView addSubview:newView.view]; 
//[newView release]; 
} 

Répondre

2

En fait, vous obtenez quelque chose d'utile de la console. Il vous indique que vous n'avez pas activé NSZombie - "Définition de la variable d'environnement" NSZombieEnabled "à une valeur nulle."

La valeur doit être OUI non nulle.

Exécutables -> Votre nom cible -> Arguments -> Variables à l'environnement dans

Même sans NSZombies lui a permis devrait être très facile de voir où votre mauvais accès est de votre pile d'appel. Le script d'action est un langage de script.

+0

Merci pour cela, je suppose que je pensais que le checkmark était une représentation raisonnable de oui. J'ai trouvé mon problème, mais je ne peux pas comprendre la solution. – pseudopeach

+0

Ce n'est pas toujours facile à trouver, grâce à la magie d'autorelease. Quand ceux-ci mordent, le backtrace n'est pas toujours utile. –

+1

Voici ce qui aide. Utilisez Instruments, exécutez avec Object Alloc. Arrêtez votre application, puis appuyez sur le petit «i» dans l'instrument ObjectAlloc et activez la détection NSZombie avec les comptages de référence. Ensuite, appuyez sur "enregistrer", votre application sera exécutée (faire cela dans le simulateur) et quand vous obtenez le "mauvais accès", il marquera dans l'outil Instruments avec une flèche - appuyez dessus et vous verrez chacun conserver et libérer contre cette objet. –

0

Il n'y a pas de raison . cette erreur doit être provoquée par un objet libéré over-il y a beaucoup d'autres raisons pour lesquelles vous pourriez s'écraser

Program received signal: “EXC_BAD_ACCESS”.

OK -. alors, où est-il cra shing? Quel est le backtrace? Il devrait avoir écrasé au débogueur et le débogueur devrait vous montrer un tas de détails au sujet du crash.

Affichez la trace et tout le code qui se trouve dans cette trace.


Ce n'est pas un backtrace, mais cela donne plus de contexte. Un backtrace serait utile car il montre exactement où l'accident se produit.

En ce qui concerne les zombies, je trouve plus facile d'utiliser l'élément de menu Run -> Run With Performance Tool -> Zombies pour lancer les instruments en mode de détection Zombie.

Que le crash disparaisse lorsque vous commentez le release indique certainement un problème de gestion de la mémoire. Le code que vous avez publié semble correct, sous l'hypothèse que vous n'avez pas remplacé new.

Avez-vous essayé "Construire et analyser"?

Si vous obtenez une table inattendue, il y a [évidemment] d'autres problèmes dans votre code. Cela pourrait également contenir des problèmes de gestion de la mémoire, aussi?

Egalement - si le removeFromSuperview: provoque l'affichage de la requête ultérieurement demandée par le segment sélectionné pour libérer & deallocate, cela peut également provoquer le blocage.


Objectif C me rend triste - Ce serait ont pris 3 secondes dans ActionScript

Tout ce que vous ne savez pas qui vous rend triste quand vous essayez de le traiter comme quelque chose sans rapport avec ce tu sais. Le succès avec n'importe quel langage, outil ou nouvel environnement dépend autant de votre attitude que des détails de l'outil.

Je vous suggère de prendre du recul, faire quelques tutoriels et/ou read some documentation about debugging applications.

+0

Voici l'endroit où il se bloque. J'essaie de charger une table dans une sous-vue. Cela fonctionnait quand je chargeais un contrôleur de vue régulier - pas une table. – pseudopeach

+0

(IBAction) toggleView { \t si (switchableView.subviews.count = 0!) \t \t [[switchableView.subviews objectAtIndex: 0] removeFromSuperview]; \t UIViewController * newView = (viewSelector.selectedSegmentIndex == 0)? \t \t [Connexion nouveau]: [UserRegistration new]; \t [switchableView addSubview: newView.view]; \t // [nouvelle version]; } – pseudopeach

+0

Si je commente la version, elle charge une table, mais pas vraiment celle que j'attends. Si je ne libère pas l'objet, n'est-ce pas une fuite de mémoire? Je lis ceci: http: //stackoverflow.com/questions/937767/does-uiviews-addsubview-really-retain-the-view, mais je ne comprends pas vraiment la solution – pseudopeach

Questions connexes