ARC和viewDidUnload

时间:2012-09-28 00:35:35

标签: objective-c ios cocoa-touch

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

2 个答案:

答案 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,这样您就不必担心此问题。