我正在开始编写我们的iPhone应用程序的第二版,并且试图消除以前的错误(这是我在Objective-C上的第一次尝试)。我的问题与“UIViewController销毁时需要做的事情”有关,似乎有一些相互矛盾的答案,我想确保自己理解正确。

几个约束:

  • 此代码适用于iOS 5和iOS 6设备
  • 我不希望在viewWillAppear和viewWillDisappear上注册和注销NSNotifications,因为UIViewControllers需要接收通知,即使用户看不到它们也是如此。
  • 我使用的是StoryBoard,而不是单独的nib文件。

  • 因此,考虑到上述限制,以下陈述是否正确?

    将情节提要板连接到UIViewControllers的
  • IBOutlet应该较弱,强引用将在幕后创建。
  • 因为IBOutlets很弱,所以在内存不足的情况下我不需要将它们淘汰掉
  • 我不应该使用viewDidUnload,因为它已被弃用,而我应该使用didReceiveMemoryWarning。在这种情况下,我只需要消除强属性(可以重新计算)
  • 可以在viewDidLoad上注册NSNotifications。
  • 因为我希望在隐藏视图时继续接收通知,所以注销它们的最佳位置是在dealloc中,因此在didReceiveMemoryWarning中注销它们也没有任何好处。

  • 谢谢你的帮助,

    最佳答案

    将情节提要板与UIViewControllers连接的IBOutlet应该较弱,强引用将在幕后创建。

    否。NSKeyedUnarchiver(NSCoder)不会更改与用户创建的插座关联的存储限定符。您使它们保持弱势是因为您从未显式分配和初始化IBOutlets,因此,您就不会在“可可”这个词的意义上“拥有”它们。

    因为IBOutlets很弱,所以在内存不足的情况下我不需要将它们淘汰掉

    完全不对。将弱引用归零会在dealloc中(而不是在内存不足的情况下)归零。 Apple希望您通过显式释放强大的接口来处理内存警告来做到这一点。

    我不应该使用viewDidUnload,因为它已被弃用,而我应该使用didReceiveMemoryWarning。在这种情况下,我只需要消除强属性(可以重新计算)

    是的,但是对于-viewDidUnload的替代,dealloc可以达到这个目的。

    在viewDidLoad上注册NSNotifications是可以接受的。
    因为我希望在隐藏视图时继续接收通知,所以注销它们的最佳位置是在dealloc中,因此在didReceiveMemoryWarning中注销它们也没有任何好处。

    绝对。

    关于ios - 当我需要销毁UIViewControllers时,我应该如何整理它们,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/15159493/

    10-13 09:26