2016-04-29 3 views
3

Я использую контекстное переключение ключевых 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] вещи в стеке вызовов.

Call stack after tapping inside new UIWindow triggering dealloc of old UIWindow

Я считаю такое поведение совершенно странно, там должно быть что-то неправильно в UIKit, я не ожидал что нет ничего плохого с моей стороны с этим подходом.

+0

Вы выяснили, в чем причина такого поведения и как его избежать? – Werewolf

+0

К сожалению, нет, еще нет. Даже при экспериментировании вокруг минимального примера это поведение по-прежнему происходит. – michi

ответ

-1

См the resignKeyWindow documentation:

Никогда не вызывать этот метод напрямую. Система вызывает этот метод и сообщений UIWindowDidResignKeyNotification, чтобы окно знать, когда он больше не ключ ...

Попробуйте удалить, что и увидеть, если он фиксирует аварию.

+0

Вы правы, это нормально, чтобы не называть его. С или без, все равно никакого эффекта. Это не сбой, но окно сохраняется (не освобождается, как я ожидаю, когда бросаю все ссылки), пока пользователь не коснется события. Вот в чем вопрос. – michi

Смежные вопросы