繁体   English   中英

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

[英]iOS – Deallocation issue when switching UIWindow

UIWindow在我的应用程序中根据上下文切换关键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-keyWindowAppDelegate-window ,两者都具有新UIWindow分配的对象。

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

在新 UIWindow 内部敲击后调用堆栈触发旧 UIWindow 的释放

我发现这种行为非常奇怪, UIKit一定有问题,我不希望这种方法有任何问题。

请参阅resignKeyWindow文档

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

尝试删除它并查看它是否修复了崩溃。

问题是 UIApplication 的 keyWindow 根据定义很弱。 所以你应该把你的 UIWindow 强烈地连接到某个对象上; 像 ApplicationDelegate 或一些单例。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM