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

Mar*_*oft 5 iphone memory-management ios

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

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

Hea*_*ser 1

在 iOS 中分配是很棘手的,我使用@property(非原子,保留)。与 Mac OS 不同,iOS 中连接到 XIB 对象的插座不会自动保留和管理内存,这可能会随着 iOS 5 的改变而改变,但可能性不大。

其基本原理是,您可以在 - (void)viewDidUnload 中释放任何视图对象,并删除您不需要的任何视图,或者可以在 -(void)viewWillAppear 上重新初始化。但表面上,目标是让您控制收集的内容和未收集的内容。

我的模式是为它们声明普通的可可访问器,就像我为任何其他属性所做的那样,并在 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;
}
Run Code Online (Sandbox Code Playgroud)

你是对的,但是,保留窗口并没有多大意义,但恕我直言,这对于一致性来说是有意义的。这么长的说是的,根据我的经验,应用程序委托确实需要保留 UIWindow,否则它可以在内存扫描中收集并导致一些随机崩溃。

  • UIApplication 确实保留了应用程序的顶部窗口,但是当使用 VGA out 时,您可能有多个窗口,因此如果您在使用它时需要 resignKeyWindow,我认为您将需要保留。来自苹果的文档“您可以通过编程方式或使用 Interface Builder 创建和配置应用程序的主窗口。在任何一种情况下,您都在启动时创建窗口,并且应该保留它并将对其的引用存储在应用程序委托对象中。” - https://developer.apple.com/library/ios/#documentation/WindowsViews/Conceptual/ViewPG_iPhoneOS/CreatingWindows/CreatingWindows.html (2认同)