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