在viewDidUnload中释放多少

时间:2011-08-25 20:36:09

标签: objective-c

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}}。这是正常做法吗?

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;
}