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