UIWindow makeKeyAndVisible不适合使用ARC

时间:2011-12-28 21:00:09

标签: iphone cocoa-touch uikit

我正在重新创建某种特定于我的应用的UIAlertView,因此我将UIWindow作为子类来完成它。窗口将添加到[UIApplication sharedApplication].windows,但实际上从未显示过。我把它修剪成这段小代码:

UIWindow *testWindow = [[UIWindow alloc] initWithFrame:self.view.bounds];
testWindow.backgroundColor = [UIColor blueColor];
[testWindow makeKeyAndVisible];

当我记录[UIApplication sharedApplication].windows时,我看到:

"<UIWindow: 0x83774f0; frame = (0 0; 320 480); opaque = NO; autoresize = RM+BM; layer = <UIWindowLayer: 0x8377660>>",
"<UIWindow: 0x8382630; frame = (0 0; 300 400); layer = <UIWindowLayer: 0xf573e60>>"

然而,那个蓝色背景色的第二个窗口现在无处可见。

更新:只有在启用ARC时,这似乎才是问题。我创建了2个新的“单视图”项目,一个启用了ARC,另一个启用了ARC。两者都是相同的,我将UIWindow代码添加到主视图控制器的viewDidAppear:。当我在模拟器中运行应用程序时,蓝色窗口仅显示在禁用ARC的项目中。看起来ARC过快地摆脱了我的UIWindow,所以它甚至没有时间出现。使其__strong没有帮助。还是一无所知......

2 个答案:

答案 0 :(得分:11)

  

看起来ARC过快地摆脱了我的UIWindow,所以它甚至没有时间出现。使其__strong没有帮助。

制作__strong的内容?您在问题中显示的变量似乎是一个局部变量,该变量仅在方法返回之前存在。当方法返回时,变量消失,因此没有任何东西拥有窗口,因此它将被释放。

将窗口的指针指向__strong实例变量或strong属性。那么你将拥有更持久的所有权,让窗户保持活力。关闭窗口后,将ivar或属性设置为nil

作为旁注,你确定你想要它是UIWindow的子类而不是UIView吗?甚至UIAlertView也是一个视图,而不是一个窗口。如果它创建了自己的窗口,您可能希望这样做 - 让视图创建自己的窗口作为实现细节。

答案 1 :(得分:0)

  1. 文档提到您应该使用UIScreen来确定界限:[[UIScreen mainScreen] bounds]
  2. 我不确定是否需要,但您没有在窗口中添加UIView
  3. 我注意到opaque = NO - 尝试[window setOpaque:NO];或类似的东西。
  4. 我测试了你的代码并得到了:

      

    应用程序窗口应在应用程序启动结束时具有根视图控制器

    基本上,使用[window setRootViewController:...];。不要问我原因,这对我来说真的不需要。