Desenvolvimento iPhone - Meu aplicativo trava quando eu alterar a orientação

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

  •  19-08-2019
  •  | 
  •  

Pergunta

Eu estou colidindo este problema onde meu aplicativo obtém erro EXC_BAD_ACCESS e stucks / pára. Eu estou usando "Girar para a esquerda" e "direita" Rotate opções de simulador para simular o comportamento mudança de orientação. Quais podem ser as possíveis razões para esse erro? Desde que eu não estou recebendo detalhes sobre o erro, eu não posso segui-lo.

Todas as minhas classes do controlador ter:

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

Todas as ideias, os ponteiros? Obrigado.


Mas o meu código não tem uma chamada para [UIDevice setOrientation:]. Método

Este é o traço que eu recebo na janela de depuração:

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

Note que o erro aparece quando minha vista contém uma barra de abas. Uma vez que ninguém está respondendo, eu acho que isto não é um problema comum, e eu não posso encontrar qualquer recurso abordar esta questão.

Posso alguma forma dizer ao meu aplicativo para ser executado na orientação única (retrato), e não enviar eventos para a mudança de orientação.? Isso pode resolver o meu problema, mas esta é a alternativa que eu estou procurando.


Graças Paul, o seu comentário foi útil, e eu era capaz de resolver o problema, mas com o custo de retenção de memória para a vista eu não preciso. Aqui está o que está acontecendo:

Eu tenho uma visão (Ver A) que abre uma outra visão (View B). método App Delegado é responsável por abrir tanto faz View A e Vista B. Aplicação não cai em View A. I remover View A partir da janela, e liberá-lo do objeto controlador, e adicionar View B para a janela. Eu acredito que este é o lugar onde eu estou fazendo algo errado. Você pode me ajudar com o código?

Aqui está o código para liberar View A e abrindo View 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];
}

Eu comecei a aplicação com modelo de aplicativo barra de abas, e viewControllerB é do tipo UITabBarController. Eu definitivamente estou fazendo algo errado aqui. Os ponteiros?

Foi útil?

Solução

Não é incomum para curso código da biblioteca do sistema devido a algo que você não configurar muito bem. Isso pode ser que seu UIWindow ou seu ponto de vista de conteúdo ou sua instância controlador de vista não foi mantida ou foi liberado de alguma forma.

Esse método shouldrotate não vai ajudar se o controlador não é ainda ao redor.

As sugestões de rpetrich ainda pode ser útil para identificar qual objeto foi lançado.

Para problemas especialmente espinhosos, você pode adicionar liberação, reter e métodos dealloc (que log e chamada de super) a uma classe suspeito de vocês e ver o que está liberá-lo. Registrar o -retaincount de manter o controle (eu só uso isso para fins de diagnóstico, não para fazer o gerenciamento de memória em um aplicativo de envio).

Outras dicas

Definir um ponto de interrupção -[UIDevice setOrientation:] e passo através de seu código no depurador.

Para fazer a depuração mais fácil, você pode digitar direito call (void)instrumentObjcMessageSends(YES) no console depurador para começar a registrar objc_msgSends para / tmp /, execução, em seguida, continue e vai rastrear todas as mensagens que são enviadas e até o acidente.

Eu também enfrentou o mesmo problema, eu acho que se o viewcontroller é liberado usando [liberação ViewController], mas ainda usando a vista e por esse tempo se a mudança da orientação do aplicativo falha.

Você tem que descobrir exatamente quando você deve liberar o viewcontroller [propably na saída].

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top