ARC and viewDidUnload



如果我的视图层次结构中有一个对视图的强引用,我必须在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,这样您就不必担心这个问题。

最新更新