Я использую контекстное переключение ключевых UIWindow
сек в моем приложении, чтобы обеспечить немного более чистый поток - окно приветствия => Главного экран со списком предметов < => Пункт контейнер с меню гамбургеров и прочим.IOS - Deallocation проблема при переключении UIWindow
Пример функции следующим образом:
- (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;
// }];
}
Я использую анимации, чтобы обеспечить хорошие переходы, но я заметил это, чтобы проверить, если это не является причиной этого вопроса у меня есть.
Вещи, после падения originalWindow
из иерархии и выхода из блока/функции, то UIWindow
не выпускаются и висит где-то в пространстве. Я тестировал это с помощью дочернего класса, поставив точку останова внутри перегруженного -dealloc
.
Я проверил как UIApplication
's -keyWindow
и AppDelegate
' s -window
, оба имеющие новый UIWindow
объект назначен.
Однако после нажатия везде на экране, то -dealloc
за предыдущий UIWindow
срабатывает с некоторой -[UITouch dealloc]
вещи в стеке вызовов.
Я считаю такое поведение совершенно странно, там должно быть что-то неправильно в UIKit
, я не ожидал что нет ничего плохого с моей стороны с этим подходом.
Вы выяснили, в чем причина такого поведения и как его избежать? – Werewolf
К сожалению, нет, еще нет. Даже при экспериментировании вокруг минимального примера это поведение по-прежнему происходит. – michi