Sviluppo iPhone - La mia applicazione si arresta in modo anomalo quando cambio orientamento

StackOverflow https://stackoverflow.com/questions/475911

  •  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?

È stato utile?

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].

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top