3

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

4

2 回答 2

6

前面的两个答案中有太多错误信息,我将确切地澄清情况。请注意,这些与 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 上告诉我们这一点)。

于 2012-09-28T14:00:44.310 回答
1

如果您有一个 ivarstrong引用了一个对象,那么只要该 ivar 指向它,该对象就会一直存在。

所以是的,您需要将指针设置为,nil否则您的强引用将使视图保持活动状态。如果视图是从 nib 加载的,但不是,rootView那么建议使用weak,这样您就不必担心这个问题。

于 2012-09-28T00:45:57.063 回答