![](/img/trans.png)
[英]iOS 8 / 7 UIWindow with UIWindowLevelStatusBar Rotation issue
[英]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
的-keyWindow
和AppDelegate
的-window
,两者都具有新UIWindow
分配的对象。
然而,在点击屏幕上的任意位置后,前一个UIWindow
的-dealloc
被调用堆栈中的一些-[UITouch dealloc]
内容触发。
我发现这种行为非常奇怪, UIKit
一定有问题,我不希望这种方法有任何问题。
切勿直接调用此方法。 系统调用此方法并发布 UIWindowDidResignKeyNotification 以让窗口知道它何时不再是关键...
尝试删除它并查看它是否修复了崩溃。
问题是 UIApplication 的 keyWindow 根据定义很弱。 所以你应该把你的 UIWindow 强烈地连接到某个对象上; 像 ApplicationDelegate 或一些单例。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.