Je ne comprends pas pourquoi cela me donne un EXC_BAD_ACCESS. Arrière-plan de base, je recueille et traite certaines informations, puis utilise une vue modale pour laisser l'utilisateur confirmer s'il veut continuer.Iphone UIAlertView lance EXC_BAD_ACCESS. - Édité, pas causé par UIAlertView
J'ai un bouton dans la barre de navigation appelé continuer, qui appelle ma fonction de préparation de données.
- (void)viewDidLoad {
//Other stuff
UIBarButtonItem *next = [[UIBarButtonItem alloc]
initWithTitle:@"Next"
style:UIBarButtonItemStyleBordered
target:self
action:@selector(prepData)];
self.navigationItem.rightBarButtonItem = next;
[next release];
[super viewDidLoad];
}
prepData:
-(void)prepData{
/*
There's a bunch of stuff going on here, if "mensaje" is not an empty NSString, there is some kind of error that wont let me go on, if not, everything in the data is fine
*/
if(![mensaje isEqualToString:@""]){
UIAlertView *alert = [[UIAlertView alloc]
initWithTitle:nil
message:mensaje
delegate:nil
cancelButtonTitle:@"Aceptar"
otherButtonTitles:nil];
[alert show];
[alert release];
}else{
UIActionSheet *actionSheet = [[UIActionSheet alloc]
initWithTitle:@"¿Esta seguro que desea realizar estas operaciones?"
delegate:self
cancelButtonTitle:@"Cancelar"
destructiveButtonTitle:@"Aceptar"
otherButtonTitles:nil];
[actionSheet showInView:self.view];
[actionSheet release];
}
}
Si debugger, je peux faire tout le chemin à travers la prepData(), dès que je presse continue je reçois un EXC_BAD_ACCESS. Si je commente la [releaseSheet]; Je ne reçois pas l'exception, mais à ma connaissance, tout comme les vues d'alerte, les fiches d'action «restent» jusqu'à ce qu'elles s'affichent.
Au moins tous les livres que j'ai lus l'indiquent, mais il est tout à fait possible que je ne comprenne pas quelque chose dans le autoreleasing.
Juste pour référence, l'alerte apparaît très bien.
Quelqu'un at-il une idée de ce qui se passe ici?
Merci, Stefano. Editer: Compris, le code ci-dessus pour les feuilles d'actions et les vues d'alerte est très bien, le problème était que je libérais quelque chose qui a été plus tard essayant d'être auto-libéré.
Je boucle qui fait cela:
for(someConditions){
NSString *montoFormateado = [[[NSString alloc] initWithFormat:@"%.2lf",[monto doubleValue]] stringByReplacingOccurrencesOfString:@"." withString:@","];
[_postBuild setObject:[NSString stringWithString:montoFormateado] forKey:[NSString stringWithString:iidvar]];
[montoFormateado release];
}
postBuild = [_postBuild mutableCopy];
[_postBuild release];
Maintenant, il semble que l'erreur était dans le fait qu'en utilisant [NSString strintWithString: montoFormateado] je quittais cette chaîne pour autorelease plus tard, mais quand J'ai libéré _postBuild que la chaîne a été libérée aussi, j'ai enlevé cela et juste utilisé setObject: montoFormateado et son fonctionnement bien.
Sa mémoire qui fuit, mais je pense que c'est pour une question différente, l'exc_bad_access a été résolu.
très petite chose, mais généralement je pense que c'est une meilleure idée d'appeler [super viewDidLoad] avant d'apporter des modifications, pas à la fin de la méthode. Le seul moment où vous voulez mettre [super xxx] à la fin d'une méthode est lorsque vous appelez dealloc. – makdad
Merci pour le conseil, en changeant cela. Laissez-moi essayer avec des zombies pour voir si je reçois quelque chose. – blindstuff
Le problème est très probablement dans le code que vous avez omis - peut-être que mensaje est publié trop souvent (c'est-à-dire libérant une chaîne autoreleased). – Eiko