2011-08-31 4 views
0

Je démarre ma première application iOS et une erreur se produit uniquement lorsque l'utilisateur touche l'UItableView. Cette application est une aide pour conjuguer les verbes en japonais. Voici comment cela fonctionne:iOS UITableView obtient EXC_BAD_ACCESS lorsque l'utilisateur interagit

J'ai une première vue qui demande à l'utilisateur un verbe japonais dans l'alphabet. Je crée une instance d'une classe Conjuger qui copie le verbe entré et prépare l'analyse. Je crée une instance de mon resultViewController. J'associe mon objet conjugué à une propriété de ce contrôleur. J'affiche la vue de manière modale. Le resultViewController affiche tout bien, toutes les données étant chargées à partir de l'objet Conjuger créé à partir de sa vue parente. Mais, si je touche l'écran pour faire défiler la vue, cela me donne une erreur EXC_BAD_ACCESS. J'ai essayé de le déboguer, mais je ne suis pas encore assez bon pour trouver l'origine du problème. Je suspecte que mon objet conjugué soit libéré. L'impair est tat l'attribut de cet objet "verbe" est toujours intact, mais d'autres propriétés sont vides ... Comment se fait-il?

Voici mon objet Conjuger déclaration:

@interface Conjuger : NSObject 
{ 
    NSString *verb; 

    //parties qui concernent l'analyse du verbe 
    //========================================= 
    int group; 
    NSString *verbEnd; //la terminaison du verbe 
    NSString *verbBase; //la base du verbe que l'on emploi dansl es conjugaisons 

    //declinaisons possibles 
    //====================== 
    /* 
    Les clefs sont : 
    pre : present ou pas : passé 
    a : affirmatif ou n : négatif 
    n : neutre ou p : poli 
    */ 
    NSMutableDictionary *declinaisons; 
    //les declinaisons vont etre separees en section pour la table view 
    int declinaisonsSections; 
    //Titres des sections 
    NSArray *sectionsTitles; 
} 

@property (nonatomic, retain) NSString *verb; 
@property (nonatomic) int group; 
//@property (nonatomic, retain) NSMutableDictionary *declinaisons; 

-(Conjuger *) initWithVerb:(NSString *) verb_; 

//analyse du verb (recherche du groupe etc...) 
-(int) _analyse; 

//action de conjugaison du verbe 
-(BOOL) conjugate; 

//nombre de sections disponibles 
-(NSInteger) sectionsCount; 

//nombre de lignes dans une section donnee 
-(NSInteger) sectionLinesCount:(NSInteger) sectionId; 

//permet deretourner le titre d'une section 
-(NSString *) sectionTitle:(NSInteger) sec; 

//permet de retourner une declinaison pour une section precise 
-(NSString *) declinaisonsBySection:(int) sec sectionLine:(int) secline; 

@end 

Mon UITableView n'a pas de délégué, mais seulement mon ResultViewController comme source de données. L'erreur EXC_BAD_ACCESS apparaît dans la méthode titleForHeaderInSection. Cette méthode contient:

- (NSString *)tableView:(UITableView *)tableView titleForHeaderInSection:(NSInteger)section 
{ 
    return [conjug sectionTitle:section]; 
} 

methos est appelé THe après le chargement, par le UITableView je pense, mais comme ce contrôleur est pas UITableViewDelegate, pourquoi cette méthode fait appel à l'action de l'utilisateur? Juste un parchemin au fait ...

Mon UITableView ne prend pas tout l'écran et est placé dans une vue.

Je ne sais pas quels détails je peux ajouter, s'il vous plaît demander si vous avez besoin d'informations. Je peux poster plus de code ou de captures d'écran si nécessaire.

Edit: Voici le code où j'instancier mon objet Conjuger et lui attribuer à mon avis sescond contrôleur

//creation de l'objet conjuger qui servira a afficher les resultats dans la vue modale 
     Conjuger *conjug = [[[Conjuger alloc] initWithVerb:verb.text] autorelease]; 

     //chargement de la vue modale 
     ConjugerResultsViewController *res = [[[ConjugerResultsViewController alloc] init] autorelease]; 
     res.conjug = conjug; 

     //affichage 
     [self presentModalViewController:res animated:YES]; 

J'ai un autorelease ici, mais je ne me sens pas mon objet à libérer, ou pas complètement si c'est possible. Mon attribut conjuger "verbe" contient toujours les données, mais pas mes sectionsTitres ... Devrais-je déclarer toutes mes propriétés avec @property (nonatomic, retain)? Je pensais @property pour être utilisé seulement si nos attributs doivent être appelés de l'extérieur de notre objet, ai-je tort? Je me sens confus maintenant :(

Mais j'ai changé mes attributs avec @property et j'y accède par "self" comme proposé et ça marche! Mais je ne comprends toujours pas pourquoi ... J'essaie de trouver lectures plus-c objectif, mes cours de C sont loin derrière moi maintenant -_-.

Je vais enquêter avec Apple-i dans Xcode4 tel que proposé, il peut être utile pour d'autres problèmes.

Merci pour votre lecture et votre aide

+0

Vous devez utiliser des instruments et activer la détection NSZombie. – Kheldar

+0

Il est probable que le conjugué soit désaffecté à ce stade. Si vous avez une propriété, utilisez 'self.conjug' et cherchez aussi des endroits dans votre code où vous appelez [release de conjugaison] ou autorelease. – Joe

+0

Pouvez-vous poster le code où vous affectez –

Répondre

0

Si le crash est dans [section de la section: Titre:], j'imagine que vos titres de section sont un zombie.Assurez-vous de conserver le tableau des titres de section. Exec_bad_access signifie généralement que vous avez un zombie.

+0

Salut AndrewS, j'ai changé mon code pour déclarer ** @ propriété (nonatomic, retenez) NSArray * sectionsTitles ** et cela a fonctionné, je dois juste accéder à mes attributs avec moi-même. Mais je ne comprends pas pourquoi, puisque cet attribut n'est utilisé qu'à l'intérieur de la classe ...? –

+1

Les propriétés font deux choses. L'un est d'exposer des variables à d'autres classes; l'autre est la magie utile de retenir. Vous n'avez pas besoin d'utiliser une propriété pour conserver; vous pouvez simplement appeler '[sectionTitles retain];' lorsque vous créez initialement le tableau. – AndrewS

+0

Hoo, merci beaucoup, je comprends mieux maintenant, et je comprends aussi comment conserver mes objets "à la volée" en cas de besoin. Je commence à vraiment apprécier Objective-C;) –

Questions connexes