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

时间:2011-08-17 18:41:31

标签: iphone ios memory-management

在iOS应用程序的Xcode模板中,例如“基于视图的应用程序”,创建了一个包含三个顶级对象的MainWindow笔尖:App Delegate,Window和主View Controller。 App Delegate为窗口和视图控制器定义retain个出口/访问者。我不明白为什么App Delegate需要保留这些对象,因为它们已经是nib中的顶级对象,因此应该由UIApplication保留。检查这些对象的retainCount是否足够显示应用程序委托的1和窗口和视图控制器的2。我可以/我应该将这些更改为assign吗?

我知道这是一个挑剔的事情,但我希望理解为什么这样做会提高我对iOS内存管理的整体理解。

2 个答案:

答案 0 :(得分:1)

在iOS中使用@property(非原子,保留)的出口分配是棘手的。与Mac OS不同,iOS中XIB对象的连接出口不会自动保留和内存管理,这可能会因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;
}

你是对的,但是因为保留窗口并没有多大意义,但是对于一致性恕我直言。如此长时间的说法是肯定的,根据我的经验,app委托确实需要保留UIWindow,或者它可以在内存扫描中收集并导致一些随机崩溃。

答案 1 :(得分:0)

看来,应用程序委托确实确实需要保留window UIWindow。

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

@UIApplicationMain
class AppDelegate: UIResponder, UIApplicationDelegate {

    var window: UIWindow?

}

如果您删除window属性,而是使用局部变量,则该应用将启动到黑色屏幕。

Xcode还将记录错误:

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

The app delegate must implement the window property if it wants to use a main storyboard file swift


window属性设置为weak将类似地启动黑屏。将UIWindow分配给属性时,Xcode显示错误:

因为属性“窗口”为“弱”,实例将被立即释放