iOS –切换UIWindow时的解除分配问题

Mic*_*chi 5 iphone objective-c uiwindow ios

我使用上下文UIWindow在我的应用程序中切换key ,以提供更简洁的流程-欢迎窗口=>具有项目列表的主屏幕<=>带有汉堡菜单和物品的项目容器。

函数示例如下:

- (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;

//  }];
}
Run Code Online (Sandbox Code Playgroud)

我使用动画来提供良好的过渡效果,但是我已将其注释掉,以测试它是否不是引起我问题的原因。

问题是,originalWindow从层次结构中删除并退出了块/功能之后,UIWindow 它没有被释放并挂在空间的某个地方。我已经通过将重载断点放入子类中对子类进行了测试-dealloc

我检查都UIApplication-keyWindowAppDelegate-window,两者都具有新UIWindow分配的对象。

但是,在屏幕上的任意位置点击后,-dealloc前一个的会UIWindow-[UITouch dealloc]调用堆栈中的某些内容触发。

在新的UIWindow内部点击后触发旧UIWindow的解除分配后调用堆栈

我发现这种行为完全是很奇怪的,在内肯定有什么问题UIKit,我不希望这种方法有任何问题。

Ale*_*ylo -1

请参阅文档resignKeyWindow

切勿直接调用此方法。系统调用此方法并发布 UIWindowDidResignKeyNotification 让窗口知道它何时不再是关键...

尝试删除它并查看是否可以解决崩溃问题。