在iOS应用程序的Xcode模板中,例如“基于视图的应用程序”,创建了一个包含三个顶级对象的MainWindow笔尖:App Delegate,Window和主View Controller。 App Delegate为窗口和视图控制器定义retain
个出口/访问者。我不明白为什么App Delegate需要保留这些对象,因为它们已经是nib中的顶级对象,因此应该由UIApplication保留。检查这些对象的retainCount
是否足够显示应用程序委托的1
和窗口和视图控制器的2
。我可以/我应该将这些更改为assign
吗?
我知道这是一个挑剔的事情,但我希望理解为什么这样做会提高我对iOS内存管理的整体理解。
答案 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显示错误:
因为属性“窗口”为“弱”,实例将被立即释放