Objective c 在viewDidUnload中释放多少

Objective c 在viewDidUnload中释放多少,objective-c,Objective C,Apple模板在viewDidUnload中提供以下注释: //释放主视图的所有保留子视图。 //例如,self.myOutlet=nil 因此,我通常在viewDidUnload中将IB插座设置为nil,然后在dealoc中释放它们。问题是,我的所有其他保留的ivar对象,其中一些是以编程方式添加的视图,而另一些是数据模型,是否也应该在这两种方法中处理它们?若否,原因为何 从这个答案中,我推断只有与视图相关的对象应该作为=nil语句进入viewDidUnload,这可能包括非IB Outle

Apple模板在viewDidUnload中提供以下注释:


//释放主视图的所有保留子视图。
//例如,self.myOutlet=nil

因此,我通常在viewDidUnload中将IB插座设置为
nil
,然后在
dealoc
中释放它们。问题是,我的所有其他保留的ivar对象,其中一些是以编程方式添加的视图,而另一些是数据模型,是否也应该在这两种方法中处理它们?若否,原因为何


从这个答案中,我推断只有与视图相关的对象应该作为
=nil
语句进入
viewDidUnload
,这可能包括非
IB Outlet
保留视图,对吗?然后,包括数据模型在内的所有其他对象都应该作为
release
语句进入
dealloc
。这是正常做法吗?

由于内存不足,调用viewDidUnload卸载当前不可见的视图控制器的视图。此时,视图控制器的视图对象已被释放,这意味着作为viewController.view子视图的所有对象都已被释放,但如果您将它们保留在IVAR中,它们不会被释放

您应该释放在再次加载视图时将重新创建的任何对象,或者可以根据需要轻松重新创建的对象。下次使用视图时,将从NIB或通过调用loadView重新创建视图,以便重新创建您发布的所有内容

当视图来自NIB时,NIB中指定的所有视图对象都将创建并添加为视图控制器视图的子视图。任何带有IBOutlet的IVAR也会连接到这些子视图,这样您就可以“拥有”这些对象(您对它们有保留权)。你需要释放那些IVAR,这样他们才能真正得到释放

在loadView中以编程方式创建视图时,还应释放IVAR保留的对象,这些对象将在下次加载视图时在loadView中重新创建

对于在viewDidLoad(或ViewWillDisplay或其他位置)中创建的任何内容(如数据模型)也是如此,如果您可以在以后再次加载视图或需要对象时“轻松”重新创建它,则应在viewDidLoad中释放它以减少内存使用。实际上,对于非视图项,如数据模型,我将在didReceiveMemoryWarning中发布它

使用setter将nil分配给保留属性会导致向其发送释放,当您编写
self.myOutlet=nil
时,您将调用setter方法,该方法实现如下:

-(void)setMyOutlet:(id)newObject
{
    [newObject retain];     // does nothing if newObject is nil
    [myOutlet release];    
    myOutlet = newObject;
}

如果您有一个保留的数据模型作为视图控制器的ivar,并且希望在卸载视图控制器的视图时将此数据保留在内存中,则听起来viewDidLoad不是创建此模型的好地方。在这种情况下,您会推荐一种委托方法来创建视图控制器的IVAR吗?或者,更传统的做法是,通过核心数据将数据持久化到设备上。我的问题是数据模型从web获取其内容;发布它需要另一次下载才能在以后继续使用。如果你从网上下载数据,我通常不会称之为“容易”重新创建的东西。我不会发布它,或者根据它的大小和结构将它存储在核心数据、plist、NSUserDefault或sqldb中。