2010-08-20 5 views
0

Je reçois un EXC_BAD_ACCESS après avoir appelé dismissModalViewControllerAnimated sur mon contrôleur de vue. Mon projet est basé sur la vue de table projet de démarrage et RootViewController crée une vue comme ceci:EXC_BAD_ACCESS après avoir appelé popViewControllerAnimated

GobanVC *vc = [[GobanVC alloc] initWithNibName:@"GobanVC" bundle:[NSBundle mainBundle] coll:c]; 
[self.navigationController pushViewController:vc animated:YES]; 
[vc release]; 

En GobanVC.m, je suis la manipulation d'un bouton pour rejeter le point de vue:

- (IBAction) onDone:(id) sender; 
{ 
    [self.navigationController popViewControllerAnimated:YES]; 
} 

Pour une raison quelconque pour laquelle l'objet GobanVC est sur-libéré. J'ai couru l'instrument d'allocation, et je peux voir que le compte de référence est mis à 1 quand j'appelle alloc, alors les appels d'UIKit retiennent/libèrent beaucoup de fois, et alors ma version ci-dessus est manipulée. Après cela, aucune des retenues ou des libérations ne provient de mon code, et après popViewControllerAnimated, le compte devient -1 finalement.

Si je prends la sortie ci-dessus, les choses semblent bien fonctionner, donc il semble que le compte soit éteint exactement par un endroit.

Des idées?

+1

Je reçois un EXC_BAD_ACCESS après avoir appelé dismissModalViewControllerAnimated sur mon contrôleur de vue. Pourquoi dites-vous à propos de rejeter au début, puis votre code est popViewController, êtes-vous sûr que c'est correct? – vodkhang

Répondre

0

Peut-être y at-il un problème avec GobanVC. Avez-vous la mise en œuvre pour cela? Parce qu'il y a une retenue pour chaque version faite par UIKit (il devrait y avoir). Et vous dites que vos appels sont également équilibrés (un alloc et une version). Ensuite, cela signifie que dans l'implémentation de GobanVC, il doit y avoir quelque chose de mal.

-1

Comptons le retient:

  1. Alloc fait 1.
  2. de presse rend 0.

Alors, ce qui sort de la pile lorsque vous appelez pop aura retenir contre égal à 0, ce qui n'est PAS ce que vous voulez. Si vous supprimez ou relâchez la version et que vous affectez "vc" à une variable d'instance définie comme propriété "retain", tout ira bien.

A partir du code à condition que je peux voir ce qui suit: contrôleur

  1. Root crée une instance de GobanVC. Le nombre de rétention de GobanVC est 1.

  2. Les contrôleurs racines poussent l'instance GobanVC vers la pile de navigation. Je ne suis pas sûr si pousser augmente le nombre de retenue. Très probablement oui. Ensuite, le nombre de retenir par exemple GobanVC devient 2.

  3. Vous libérez l'instance GobanVC, définissant son compteur à 1.

  4. Votre gestionnaire de bouton réside dans GobanVC (pas dans le contrôleur racine). Ainsi, GobanVC se libère de la pile avec le nombre de retenue 0 (parce que si pousser augmente le compteur, pop le diminuera). C'est un problème.

+0

Votre hypothèse est correcte: pousser un contrôleur de vue lui enverra un message 'retain', et popping lui enverra une' release'. Mais je ne pense pas que ce soit un problème si le nombre de retenues atteint zéro dans 'onDone'. Le message 'popViewControllerAnimated:' sera envoyé, la fonction va quitter, et à ce moment le contrôleur de vue n'a plus besoin d'être présent. –

+0

Peut-être que oui, peut-être non. Cela dépend de ce qui se passe avant et après et de la façon dont la gestion des objets sous-jacents fonctionne. Connaissez-vous ces détails? Je ne. Au moins, je n'essaierais même pas de créer des conditions suicidaires à l'intérieur d'un objet. Dans mon expérience, ce type d'incertitude flottante (survivre ou mourir avant que je ne sois fait?) Est le type d'erreurs qui sont extrêmement difficiles à attraper et qui peuvent frapper au hasard à tout moment. – spbfox

Questions connexes