2

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

几个约束:

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

那么考虑到上述限制,以下陈述是否正确?

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

谢谢你的帮助,

4

2 回答 2

4

将情节提要连接到 UIViewControllers 的 IBOutlets 应该是弱的,强引用将在幕后创建。

不会。NSKeyedUnarchiver (NSCoder) 不会更改与用户创建的 outlet 关联的存储限定符。你让它们保持弱,因为你从来没有显式地分配和初始化 IBOutlets,因此你没有“拥有”它们在这个词的可可意义上。

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

一点也不真实。将弱引用归零在 dealloc 中归零,而不是在内存不足的情况下。Apple 希望您通过明确发布强大的插座来处理内存警告来做到这一点。

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

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

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

绝对地。

于 2013-03-01T14:26:46.973 回答
1

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

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

于 2013-03-01T14:35:41.763 回答