Apple模板在viewDidUnload中提供此注释:
// Release any retained subviews of the main view.
// e.g. self.myOutlet = nil;
所以我通常在viewDidUnload中将IB Outlets设置为nil
,然后在dealloc
中释放它们。问题是,我所有其他保留的ivar对象,其中一些是以编程方式添加的视图,而另一些是数据模型,它们是否也应该在这两种方法中处理?如果没有,为什么不呢?
从这个答案here我收集到,只有与视图相关的对象应该作为viewDidUnload
=nil
语句进入IB Outlet
语句,其中可能包含非dealloc
个保留的视图,正确?然后,所有其他对象(包括数据模型)应作为release
语句进入{{1}}。这是正常做法吗?
答案 0 :(得分:1)
viewDidUnload由于内存不足而被调用,以卸载当前不可见的视图控制器的视图。此时视图控制器的视图对象已被释放,这意味着所有的都是viewController.view的子视图已被释放的对象,但如果你是在高德留住他们,他们不会释放。
您应该释放在再次加载视图时将重新创建的任何对象,或者您可以根据需要轻松重新创建的对象。该视图使用的视图,下一次将或者从笔尖或通过调用的loadView因此所有你释放将被重新创建的那些东西被重新创建。
当您的视图来自NIB时,将创建NIB中指定的所有视图对象,并将其添加为视图控制器视图的子视图。任何带有IBOutlets的ivars也会连接到这些子视图,这样您也可以“拥有”这些对象(您可以保留它们)。你需要释放那些ivars,以便他们真正得到dealloc'd。
当被编程的loadView创建你的观点,你也应该放开你的高德保留了这些对象将在的loadView在下一次重新创建视图的负荷。
同样的方式在viewDidLoad中(或viewWillAppear中或其他地方),如数据模型建立,如果你可以重新创建它什么“容易”后,当再次查看负载或需要的对象时,那么就应该在viewDidLoad中发布减少内存使用量。实际上对于非视图项,比如数据模型,我会在didReceiveMemoryWarning中发布它。
分配零使用设定器所保持的属性会导致释放被发送到它们,当你写self.myOutlet = nil
要调用其上实现像这样的设置方法:
-(void)setMyOutlet:(id)newObject
{
[newObject retain]; // does nothing if newObject is nil
[myOutlet release];
myOutlet = newObject;
}