iOS应用程序的应用委托需要保留UIWindow吗?

6
在iOS应用程序的Xcode模板中,例如“基于视图的应用程序”,将创建一个MainWindow nib,其中包含三个顶级对象:AppDelegate、Window和主ViewController。AppDelegate为窗口和视图控制器定义了 retain outlets/accessors。我不明白为什么AppDelegate需要保留这些对象,因为它们已经是nib中的顶级对象,应该已经被UIApplication保留。检查这些对象的retainCount显示1的应用委托和2的窗口和视图控制器。我可以/应该将它们改为assign吗?
我知道这是一件小事,但我希望理解为什么要这样做,这将提高我的iOS内存管理的整体理解水平。
2个回答

1

iOS中的outlets赋值有些棘手,我使用@property (nonatomic, retain)。与Mac OS不同的是,在iOS中将XIB对象连接到outlets时不会自动保留和管理内存,这可能会在iOS 5中改变,但这种可能性相对较小。

这样做的原因是为了让您可以在- (void)viewDidUnload中释放任何视图对象,并且摆脱任何您不需要或可以在-(void)viewWillAppear中重新初始化的视图。但目标显然是让您控制什么被收集和什么不被收集。

我的模式是像为任何其他属性声明普通的cocoa访问器,并在viewDidUnload中将它们设置为nil。

- (void)viewDidUnload
{
    [super viewDidUnload];
    self.buttonOne = nil;
    self.buttonTwo = nil;
    self.buttonThree = nil;
    self.buttonFour = nil;
    self.buttonFive = nil;
    self.buttonSix = nil;
    self.lineWidthSlider = nil;
    // Release any retained subviews of the main view.
    // e.g. self.myOutlet = nil;
}

你说得没错,但是保留窗口似乎并没有太多意义,但从我的角度来看,为了保持一致性,这样做是有意义的。总之,我的经验是,应用程序委托确实需要保留UIWindow,否则它可能会在内存清理时被回收,导致一些随机崩溃。


1
但是UIApplication不是会保留nib中的所有顶级对象,包括Window吗?如果是这样的话,除非UIApplication释放它(我猜这只会在退出应用程序时发生),否则窗口永远不会通过内存清理而被清除。 - Marplesoft
1
另外,保留顶层窗口也不需要任何费用,因为只要应用程序在运行,它就永远不会被释放。+1 - TechZen
2
UIApplication 会保留应用程序的顶层窗口,但使用 VGA 输出时可能会有多个窗口,因此在使用 resignKeyWindow 时,如果需要与其一起工作,我认为您将需要保留。根据苹果的文档,“您可以通过编程或使用接口生成器创建和配置应用程序的主窗口。无论哪种情况,在启动时创建窗口并应保留它,并将其引用存储在应用程序委托对象中。”- https://developer.apple.com/library/ios/#documentation/WindowsViews/Conceptual/ViewPG_iPhoneOS/CreatingWindows/CreatingWindows.html - Heat Miser
很好。你提到的VGA输出方案很有道理,我之前没有想到过。 - Marplesoft

0

看起来应用程序委托需要保留 window UIWindow。

在新的 Xcode 项目中,应用程序委托的默认实现包括:

@UIApplicationMain
class AppDelegate: UIResponder, UIApplicationDelegate {

    var window: UIWindow?

}

如果您删除window属性并改用本地变量,则应用程序将启动到黑色屏幕。
Xcode还将记录错误:

[Application]如果要使用主故事板文件,则应用程序委托必须实现窗口属性。

如果要使用主故事板文件swift,则应用程序委托必须实现窗口属性

window 属性设置为 weak 同样会启动黑屏。当您将 UIWindow 分配给该属性时,Xcode 会显示错误:

实例将立即被解除分配,因为属性“window”是“weak”


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接