UIWindow的makeKeyAndVisible与ARC不一致

sam*_*tte 4 iphone cocoa-touch uikit

我正在重新创建某种UIAlertView特定于我的应用程序,所以我正在进行子类化UIWindow.窗口被添加到[UIApplication sharedApplication].windows,但实际上从未显示过.我把它修剪成这段小代码:

UIWindow *testWindow = [[UIWindow alloc] initWithFrame:self.view.bounds];
testWindow.backgroundColor = [UIColor blueColor];
[testWindow makeKeyAndVisible];
Run Code Online (Sandbox Code Playgroud)

当我登录时[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>>"
Run Code Online (Sandbox Code Playgroud)

然而,现在可以看到具有蓝色背景颜色的第二个窗口.

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

Pet*_*sey 11

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

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

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

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

  • 正如你的建议,我最终使它成为一个UIView子类,而后者又创建了自己的UIWindow.使该窗口成为一个强大的属性,我放心,当我将窗口设置为nil时,窗口会被保留,显示和删除.感谢你,ARC现在更有意义了! (4认同)