Desarrollo de iPhone: mi aplicación se bloquea cuando cambio la orientación

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

  •  19-08-2019
  •  | 
  •  

Pregunta

Me encuentro con este problema en el que mi aplicación obtiene el error EXC_BAD_ACCESS y se atasca. Estoy usando "Rotar a la izquierda" &erio; " Girar a la derecha " opciones de simulador para simular el comportamiento de cambio de orientación. ¿Cuáles pueden ser las posibles razones de este error? Como no obtengo detalles sobre el error, no puedo rastrearlo.

Todas mis clases de controlador tienen:

- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation {
    return (interfaceOrientation == UIInterfaceOrientationPortrait);    // Return YES for supported orientations
}

¿Alguna idea, punteros? Gracias.


Pero mi código no tiene una llamada al método [UIDevice setOrientation:].

Este es el rastro que obtengo en la ventana de depuración:

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

Tenga en cuenta que el error aparece cuando mi vista contiene una barra de pestañas. Dado que nadie responde, supongo que este no es un problema común, y no puedo encontrar ningún recurso que aborde este problema.

  

¿De alguna manera puedo decirle a mi aplicación que se ejecute en orientación única (vertical) y no envíe eventos para cambiar la orientación? Esto podría resolver mi problema, pero esta es la alternativa que estoy buscando.


Gracias Paul, tu comentario fue útil y pude solucionar el problema, pero no necesito el costo de retener memoria para la vista. Aquí está lo que está sucediendo:

Tengo una vista (Vista A) que abre otra vista (Vista B). El método de delegado de aplicaciones es responsable de abrir tanto la Vista A como la Vista B. La aplicación no se bloquea en la Vista A. Elimino la Vista A de la ventana, libero su objeto controlador y agrego la Vista B a la ventana. Creo que aquí es donde estoy haciendo algo mal. ¿Me pueden ayudar con el código?

Aquí está el código para liberar la Vista A y abrir 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];
}

Comencé la aplicación con la plantilla de la aplicación de barra de pestañas, y viewControllerB es de tipo UITabBarController . Definitivamente estoy haciendo algo mal aquí. ¿Algún indicador?

¿Fue útil?

Solución

No es raro que se bloquee el código de la biblioteca del sistema debido a algo que no configuró del todo bien. Esto podría ser que su UIWindow o su vista de contenido o su instancia de controlador de vista no se retuvo o se liberó de alguna manera.

Ese método de rotación no ayudará si su controlador aún no está disponible.

Las sugerencias de rpetrich pueden ser útiles para identificar qué objeto se liberó.

Para problemas particularmente espinosos, puede agregar métodos de liberación, retención y desasignación (que registran y llaman super) a una clase sospechosa suya y ver qué lo está liberando. Registre -retaincount para realizar un seguimiento (solo lo uso para fines de diagnóstico, no para administrar la memoria en una aplicación de envío).

Otros consejos

Establezca un punto de interrupción en - [UIDevice setOrientation:] y recorra su código en el depurador.

Para facilitar la depuración, puede escribir call (void) instrumentObjcMessageSends (YES) directamente en la consola del depurador para comenzar a registrar objc_msgSend s en / tmp /, luego < code> continuar ejecución y rastreará todos los mensajes que se envían hasta el bloqueo.

Yo también enfrenté el mismo problema, creo que si el viewcontroller se libera usando [ViewController release] pero sigue usando la vista y para ese momento si cambia la orientación, la aplicación se bloquea.

Tiene que determinar exactamente cuándo debe liberar el controlador de vista [probablemente a la salida].

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top