2011-05-26 3 views
4

Je sais, je sais. J'ai Google et j'ai cherché ici mais je n'arrive pas à comprendre ce qui se passe.EXC_BAD_ACCESS Erreur iOS

De toute façon, je reçois cette erreur lors de l'utilisation du code suivant, je suis sûr que c'est quelque chose de petit. Je sais que c'est lié à la gestion de la mémoire et à la manière dont je gère mon objet dans la méthode principale.

Voici mon code principal:

Person *p1 = [[Person alloc] init]; 
[p1 initWithFirstname:@"John" lastname:@"Doe" andAge:23]; 

outputText.text = [p1 getDetails]; // App crashes inside getDetails 

Puis, dans la classe personne est ici les deux méthodes pertinentes:

-(Person *)initWithFirstname:(NSString *)_firstname lastname:(NSString *)_lastname andAge: 
(int)_age { 
self = [super init]; 

if(self) { 
self.firstname = _firstname; 
self.lastname = _lastname; 
self.age = _age; 

} 
return self; 
} 


-(NSString *)getDetails { 
return [NSString stringWithFormat:@"%@ %@, %@", firstname, lastname, age]; 
} 
+0

cela peut être un problème de libération automatique. essayez simplement - (NSString *) getDetails { return [[NSString stringWithFormat: @ "% @% @,% @", prénom, nom, âge] retain]; } s'il vous plaît fournir plus de détails sur l'accident – iOSPawan

Répondre

9

A en juger par votre méthode init, age est un int qui signifie que le spécificateur de format est erroné. Essayez ceci:

-(NSString *)getDetails 
{ 
    return [NSString stringWithFormat:@"%@ %@, %d", firstname, lastname, age]; 
    //           ^^ format specifier for an int 
} 
+0

Merci Jeremy, c'était le problème. Maintenant, je dois dire que l'erreur n'a pas été très utile. Je pensais que c'était une erreur de gestion de la mémoire. Je me demande pourquoi NSString ne pouvait pas lancer une exception et donner une erreur plus significative. Merci encore. – conor

+2

@Conor H: L'erreur en question est une erreur sous-jacente du système d'exploitation. Sous OS X, le système d'exploitation protège la première page (4096 octets) de la mémoire afin que les programmes ne puissent pas la lire ou l'écrire. C'est piéger les déréférences des pointeurs NULL. NSString n'a pas pu lancer une exception car il n'a jamais eu de chance - le système d'exploitation a mis fin au processus. – JeremyP

2

Vous appelant d'abord la valeur par défaut init de votre objet nouvellement alloué. init renvoie un pointeur vers votre objet que vous stockez dans p1. Ensuite, vous appelez initWithFirstname:lastname:andAge: sur p1, ce qui est faux car vous avez déjà appelé un autre initialiseur en premier. Vous êtes seulement censé exécuter un initialiseur.

que vous devez faire:

Person *p1 = [[Person alloc] initWithFirstname:@"John" lastname:@"Doe" andAge:23]; 

Mais votre accident vient du fait que vous passez le numéro 23 au spécificateur de format %@. Vous devez utiliser %d pour l'âge à la place. En outre, vous devez conserver le nom et le prénom (et les libérer dans votre dealloc) pour éviter tout incident plus tard lors de l'utilisation de chaînes non const.

En raison de %@, le NSLog essaie de traiter le 23 comme un pointeur vers un objet et veut appeler la méthode description de l'objet supposé. Mais 23 est une adresse invalide/inutilisée, et essayer d'accéder à la mémoire à cette "adresse" est ce qui fait planter votre application.

5

Vous avez écrit une méthode d'initialisation, puis vous l'appelez deux fois init. Juste essayer:

Person *p1 = [[Person alloc] initWithFirstname:@"John" lastname:@"Doe" andAge:23]; 

outputText.text = [p1 getDetails]; 
Questions connexes