Sviluppo iPhone - La mia applicazione si arresta in modo anomalo quando cambio orientamento
-
19-08-2019 - |
Domanda
Sto riscontrando questo problema in cui la mia applicazione riceve l'errore EXC_BAD_ACCESS
e si blocca / si arresta. Sto utilizzando " Ruota a sinistra " & Amp; " Ruota a destra " opzioni del simulatore per simulare il comportamento del cambio di orientamento. Quali possono essere le possibili ragioni di questo errore? Dal momento che non ricevo dettagli sull'errore, non riesco a rintracciarlo.
Tutte le mie classi di controller hanno:
- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation {
return (interfaceOrientation == UIInterfaceOrientationPortrait); // Return YES for supported orientations
}
Qualche idea, puntatore? Grazie.
Ma il mio codice non ha una chiamata al metodo [UIDevice setOrientation:].
Questa è la traccia che ottengo nella finestra di debug:
objc_msgSend
-[UIWindow _handleDeviceOrientationChange:]
_nsnote_callback
__CFXNotificationPost
_CFXNotificationPostNotification
-[NSNotificationCenter postNotificationName:object:userInfo:]
-[UIDevice setOrientation:]
-[UIApplication handleEvent:withNewEvent:]
_[UIApplication sendEvent:]
_UIApplicationHandleEvent
SendEvent
PurpleEventTimerCallBack
CFRunLoopRunSpecific
CFRunLookRunInMode
GSEventRunModel
GSEventRun
-[UIApplication _run]
UIApplicationMain
main
Nota che l'errore appare quando la mia vista contiene una barra delle schede. Dato che nessuno risponde, suppongo che questo non sia un problema comune e non riesco a trovare alcuna risorsa per risolvere questo problema.
Posso in qualche modo dire alla mia applicazione di funzionare in orientamento singolo (verticale) e non inviare eventi per il cambio di orientamento.? Questo potrebbe risolvere il mio problema, ma questa è l'alternativa che sto cercando.
Grazie Paul, il tuo commento è stato utile e sono stato in grado di risolvere il problema, ma con il costo di conservare la memoria per la vista non mi serve. Ecco cosa sta succedendo:
Ho una vista (Vista A) che apre un'altra vista (Vista B). Il metodo Delegato app è responsabile dell'apertura della vista A e della vista B. L'applicazione non si arresta in modo anomalo sulla vista A. Rimuovo la vista A dalla finestra, rilascio l'oggetto controller e aggiungo la vista B alla finestra. Credo che sia qui che sto facendo qualcosa di sbagliato. Potete aiutarmi con il codice?
Ecco il codice per rilasciare la vista A e aprire la vista B:
- (void)openViewB {
[UIView beginAnimations:nil context:NULL];
[UIView setAnimationDuration:1.0];
[UIView setAnimationTransition:UIViewAnimationTransitionFlipFromLeft forView:window cache:YES];
// Remove viewControllerA from the window's view
[window removeFromSuperview];
// !-- Commenting out this block fixes the issue --!
// Release memory wired for viewControllerA view
if(viewControllerA) {
[viewControllerA release];
viewControllerA = nil;
}
// We call window:addSubView to add the viewB to the main window.
// You can use this call to add other views as child views not only to windows
// but to other views as well. (UIWindow is a subclass of UIView).
[window addSubview:viewControllerB.view];
[UIView commitAnimations];
// Override point for customization after application launch
[window makeKeyAndVisible];
}
Ho avviato l'applicazione con il modello dell'applicazione barra delle schede e viewControllerB
è di tipo UITabBarController
. Sto sicuramente facendo qualcosa di sbagliato qui. Qualche puntatore?
Soluzione
Non è raro arrestare in modo anomalo il codice della libreria di sistema a causa di qualcosa che non è stato impostato correttamente. È possibile che la tua UIWindow o la sua visualizzazione del contenuto o l'istanza del controller della vista non siano stati conservati o rilasciati in qualche modo.
Questo metodo dovrebbe non ruotare se il tuo controller non è ancora in giro.
I suggerimenti di rpetrich possono essere ancora utili per identificare quale oggetto è stato rilasciato.
Per problemi particolarmente spinosi, potresti aggiungere metodi di rilascio, conservazione e dealloc (che si registrano e chiamano super) a una tua classe sospetta e vedi cosa lo sta rilasciando. Accedi al -retaincount per tenere traccia (lo uso solo a scopo diagnostico, non per gestire la memoria in un'app di spedizione).
Altri suggerimenti
Imposta un punto di interruzione su - [UIDevice setOrientation:]
e passa attraverso il tuo codice nel debugger.
Per semplificare il debug, puoi digitare call (void) instrumentObjcMessageSends (YES)
direttamente nella console del debugger per iniziare a registrare objc_msgSend
s in / tmp /, quindi < code> continue e traccerà tutti i messaggi inviati fino al crash.
Anch'io ho affrontato lo stesso problema, penso che se il viewcontroller viene rilasciato usando [ViewController release] ma ancora usando la vista e a quel punto se cambi l'orientamento l'applicazione si arresta in modo anomalo.
Devi capire esattamente quando dovresti rilasciare il viewcontroller [probabilmente all'uscita].