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
Vous devez utiliser des instruments et activer la détection NSZombie. – Kheldar
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
Pouvez-vous poster le code où vous affectez –