如果我对视图层次结构中的视图有强烈的引用,我是否必须在viewDidUnload中将其设置为nil,还是由ARC处理?
答案 0 :(得分:6)
在前面两个答案中有很多错误的信息,我将详细说明情况。请注意,这些是相对于DEPLOYMENT目标,而不是您是否使用iOS6 SDK构建):
你不用担心self.view - UIViewController管理
顶级对象 - 即那些未包含在另一个对象中的对象 - 必须是强大的
其他对象应该使用weak(系统nil是释放时的ivar,防止崩溃尝试使用已发布的对象)
在iOS6之前的设备上进行部署,使用viewDidUnload释放顶级对象以及您想要的任何其他内容。注意:在此之后不调用dealloc - 当导致消息的内存问题消失并且视图重新出现时,您获得的下一条消息可能是viewDidLoad)
对于iOS6及更高版本,请不要使用viewDidUnload(请参阅下面的编辑),如果要释放与视图或其他UI对象无关的内存,请使用didReceiveMemoryWarning。
在所有版本中调用dealloc。使用ARC,你不会打电话给super,而且你不会像过去那样释放内存。
编辑:从iOS6 SDK UIViewController类描述:
viewDidUnload 从控制器的视图释放时调用 记忆。 (在iOS 6.0中已弃用。视图不再被清除 低内存条件,因此永远不会调用此方法。)
Apple所做的是删除后备存储 - 缓存的像素。他们发现这消除了大部分消耗的内存,并且viewDidUnload的实现很差(他们在2012年WWDC上告诉我们)。
答案 1 :(得分:1)
如果你有一个对象有strong
引用的ivar,那么只要ivar指向它就会挂起该对象。
所以是的,您需要将指针设置为nil
,否则您的强引用会使视图保持活动状态。如果视图是从笔尖加载的,而不是rootView
,则建议使用weak
,这样您就不必担心此问题。