当需要销毁UIViewControllers时,我应该如何整理它们

时间:2013-03-01 13:58:41

标签: ios objective-c ios5

我开始编写iPhone应用程序的第二个版本,我正在尝试整理以前的错误(因为这是我第一次尝试使用Objective-C)。我的问题与“当UIViewController被销毁时我需要做的事情”有关,似乎有一些矛盾的答案,我想确保我理解正确。

一些约束:

  1. 此代码适用于iOS 5和iOS 6设备
  2. 我不希望在viewWillAppear和viewWillDisappear上注册和取消注册NSNotifications,因为UIViewControllers需要接收通知,即使用户无法看到它们。
  3. 我正在使用StoryBoard而不是单独的nib文件。
  4. 因此,考虑到上述约束,以下陈述是真的吗?

    1. 将故事板连接到UIViewControllers的IBOutlets应该很弱,强大的参考将在幕后创建。
    2. 因为IBOutlets很弱,所以我不应该在内存不足的情况下将它们弄清楚
    3. 我不应该使用viewDidUnload,因为它已被弃用,而应该使用didReceiveMemoryWarning。在这种情况下,我只需要排除强大的属性(可以重新计算)
    4. 在viewDidLoad上注册NSNotifications是可以接受的。
    5. 因为我希望在隐藏视图时继续接收通知,所以取消注册它们的最佳位置是dealloc,在didReceiveMemoryWarning中取消注册它们也没有任何好处。
    6. 感谢您的帮助,

2 个答案:

答案 0 :(得分:4)

  

将故事板连接到UIViewControllers的IBOutlets应该很弱,强大的参考将在幕后创建。

没有。 NSKeyedUnarchiver(NSCoder)更改与用户创建的插座关联的存储限定符。你保持弱势,因为你没有明确地分配和初始化IBOutlets,因此你不会在单词的可可意义上“拥有”它们。

  

因为IBOutlets很弱,所以我不应该在低内存情况下将它们弄清楚

根本不是真的。归零弱引用在dealloc中归零,而不是在低内存情况下归零。 Apple希望您通过明确释放强大的出口来处理内存警告来实现这一目标。

  

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

是的,但是对于-viewDidUnload的替换,dealloc就是为了这个目的。

  

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

绝对

答案 1 :(得分:1)

我相信你说的是对的。关于IBOutlets和强/弱引用,请参阅this thread

至于通知:在didReceiveMemoryWarning中取消注册它们似乎毫无意义,因为它们在取消注册时不会释放任何内存。因此,你在解除分配时取消注册是正确的。