iOS: problema de distribución cuando se cambia UIWindow

Utilizo para contextual cambiar la UIWindow key en mi aplicación para proporcionar un flujo de limpieza un poco – Ventana de bienvenida => Pantalla principal con list de elementos <=> Contenedor de artículos con menu de hamburguesas y cosas por el estilo.

La siguiente function de ejemplo:

 - (void)updateKeyWindow:(UIWindow *)window withTransition:(WindowTransition)transition { UIWindow *originalWindow = _keyWindow; _keyWindow = window; window.alpha = 0; [originalWindow resignKeyWindow]; [originalWindow resignFirstResponder]; originalWindow.userInteractionEnabled = NO; [window makeKeyAndVisible]; window.transform = (transition == WindowTransitionFlyDown) ? CGAffineTransformMakeScale(1.02, 1.02) : (transition == WindowTransitionFlyUp) ? CGAffineTransformMakeScale(.96, .96) : CGAffineTransformIdentity; // [UIView animateWithDuration:.24 animations:^{ window.alpha = 1; originalWindow.alpha = 0; window.transform = CGAffineTransformIdentity; originalWindow.transform = (transition == WindowTransitionFlyDown) ? CGAffineTransformMakeScale(.96, .96) : (transition == WindowTransitionFlyUp) ? CGAffineTransformMakeScale(1.02, 1.02) : CGAffineTransformIdentity; // } completion:^(BOOL b){ [originalWindow resignFirstResponder]; [originalWindow removeFromSuperview]; [originalWindow.rootViewController.view removeFromSuperview]; originalWindow.rootViewController = nil; originalWindow = nil; // }]; } 

Utilizo animaciones para proporcionar buenas transiciones, pero lo he comentado para probar si no es la causa del problema que tengo.

La cuestión es que, después de eliminar originalWindow de la jerarquía y abandonar el bloque / function, la UIWindow NO se libera y se cuelga en alguna parte del espacio. He probado esto con la class secundaria poniendo breakpoint dentro sobrecargado -dealloc .

UIApplication la -keyWindow y la -window AppDelegate -keyWindow , ambos tienen un nuevo object UIWindow asignado.

Sin embargo, después de tocar en cualquier lugar de la pantalla, el -dealloc para la UIWindow anterior se activa con algo -[UITouch dealloc] cosas en la stack de llamadas.

Llamar a la pila después de tocar dentro del nuevo UIWindow desencadenar el desbloqueo de la vieja UIWindow

Encuentro este comportamiento completamente extraño, debe haber algo mal dentro del UIKit , no espero que haya algo malo de mi parte con este enfoque.

Consulte la documentation de resignKeyWindow :

Nunca llame a este método directamente. El sistema llama a este método y publica UIWindowDidResignKeyNotification para que la window sepa cuando ya no es key …

Intenta eliminar eso y ver si soluciona el locking.