UIBarButtonItem si blocca iphone app quando fa clic sul pulsante
-
21-08-2019 - |
Domanda
UIBarButtonItem *rButton = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemRefresh target:self action:NULL];
rButton.action = @selector(refreshAction);
self.navigationItem.rightBarButtonItem = rButton;
[rButton release];
Il codice sopra funziona bene per creare un pulsante e aggiungerlo alla barra di navigazione, ma quando clicco sul pulsante si blocca l'applicazione con un EXC_BAD_ACCESS. Se io commento rButton.action = @selector (refreshAction); Cliccando il pulsante non farà nulla, ma non va in crash neanche.
- (void)refreshAction {
NSLog(@"refreshAction");
}
Questo codice è in un metodo di TableViewController viewDidLoad che viene inserito nello stack navigationController dal metodo NavigationViewController viewDidLoad.
Ho passato probabilmente 3 ore a cercare di ottenere questo al lavoro, senza alcun risultato.
Soluzione
Come al solito la gestione della memoria era il colpevole. Caricamento del tableViewController dal navigationController:
NearbyTableViewController *tableController = [[[NearbyTableViewController alloc] initWithNibName:@"NearbyTableViewController" bundle:nil] autorelease]; self.nearbyTableController = tableController;
[self pushViewController:self.nearbyTableController animated:YES]; [tableController release];
<=>
rilasciando un oggetto impostato autorelease ... deve essere l'errore più comune nella gestione della memoria. Cancellando quella linea [rilascio tableController] risolto il problema
Altri suggerimenti
Hai avuto fortuna se si specifica @selector(refreshAction)
quando si crea il pulsante, cioè:.
UIBarButtonItem *rButton = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemRefresh target:self action:@selector(refreshAction)];
Forse il bersaglio non viene salvato se non si specifica anche l'azione al di inizializzazione.
Non sono esattamente sicuro al 100% perché il codice non funziona, ma impostando il selettore direttamente nel costruttore funziona:
UIBarButtonItem *rButton = [[UIBarButtonItem alloc]
initWithBarButtonSystemItem:UIBarButtonSystemItemRefresh
target:self
action:@selector(refreshAction)];