ARC和viewDidUnload

0xS*_*ina 3 cocoa-touch objective-c ios

如果我在视图层次结构中有一个对视图的强引用,我是否必须在viewDidUnload中将其设置为nil,还是由ARC处理?

Dav*_*d H 6

在前两个答案中有很多错误的信息,我将准确地澄清情况.请注意,这些是相对于DEPLOYMENT目标,而不是您是否使用iOS6 SDK构建):

  • 你不用担心self.view - UIViewController管理它

  • 顶级对象 - 即那些未包含在另一个对象中的对象 - 必须是强大的

  • 其他对象应该使用weak(系统nil是释放时的ivar,防止崩溃尝试使用已释放的对象)

  • 要在iOS6之前的设备上进行部署,请使用viewDidUnload释放顶级对象以及您想要的任何其他对象.注意:在此之后不调用dealloc - 当导致消息的内存问题消失并且视图重新出现时,您获得的下一条消息可能是viewDidLoad

  • 对于iOS6及更高版本,请不要使用viewDidUnload(请参阅下面的编辑),如果要释放与视图或其他UI对象无关的内存,请使用didReceiveMemoryWarning.

  • 在所有版本中调用dealloc.使用ARC,您不会调用超级,并且不会像过去那样释放内存.

编辑:从iOS6 SDK UIViewController类描述:

viewDidUnload从内存释放控制器视图时调用.(在iOS 6.0中不推荐使用.在低内存条件下不再清除视图,因此永远不会调用此方法.)

Apple所做的是删除后备存储 - 缓存的像素.他们发现这消除了大部分消耗的内存,并且viewDidUnload的实现很差(他们在WWDC 2012上告诉我们).