UIBarButtonItem crashes application iphone lorsque le bouton est cliqué
-
21-08-2019 - |
Question
UIBarButtonItem *rButton = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemRefresh target:self action:NULL];
rButton.action = @selector(refreshAction);
self.navigationItem.rightBarButtonItem = rButton;
[rButton release];
Le code ci-dessus fonctionne très bien pour créer un bouton et l'ajouter à la barre de navigation, mais quand je clique sur le bouton, il bloque l'application avec un EXC_BAD_ACCESS. Si je commente sur rButton.action = @selector (refreshAction); cliquant sur le bouton ne fera rien, mais ça ne plante pas non plus.
- (void)refreshAction {
NSLog(@"refreshAction");
}
Ce code est dans un procédé de viewDidLoad TableViewController qui est poussé sur la pile NavigationController de la méthode NavigationViewController viewDidLoad.
J'ai passé probablement 3 heures à essayer d'obtenir que cela fonctionne, mais en vain.
La solution
La gestion de la mémoire habituelle était le coupable. Chargement du tableViewController du NavigationController:
NearbyTableViewController *tableController = [[[NearbyTableViewController alloc] initWithNibName:@"NearbyTableViewController" bundle:nil] autorelease]; self.nearbyTableController = tableController;
[self pushViewController:self.nearbyTableController animated:YES]; [tableController release];
<=>
libérer un objet mis à l'AutoRelease ... doit être l'erreur la plus commune dans la gestion de la mémoire. La suppression de cette ligne [libération tableController] a résolu le problème
Autres conseils
Un peu de chance si vous spécifiez lorsque vous créez @selector(refreshAction)
le bouton, i.e.:.
UIBarButtonItem *rButton = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemRefresh target:self action:@selector(refreshAction)];
Peut-être que la cible ne soit pas enregistrée si vous ne spécifiez pas aussi l'action à l'initialiseur.
Je ne suis pas 100% sûr pourquoi votre code ne fonctionne pas, mais plaçant le sélecteur directement dans le constructeur FONCTIONNE:
UIBarButtonItem *rButton = [[UIBarButtonItem alloc]
initWithBarButtonSystemItem:UIBarButtonSystemItemRefresh
target:self
action:@selector(refreshAction)];