1

我对 ARC for iOS 还很陌生(对 iOS 也很陌生),我有几个关于 ARC 的快速问题。

~ 在视图控制器中,如果我的 viewDidUnload() 方法中没有将我的属性设置为 nil 的语句,当我的视图控制器被释放时,属性的内存是否仍会被释放?如果是这样,为什么我需要明确地拥有这个 viewDidUnload 方法?

~ 在不是视图控制器的对象中,我应该在哪里将属性设置为 nil?在dealloc中?诸如@property BOOL isActive;...之类的原始属性怎么样?我需要将它们设置为零/零吗?

谢谢。

4

3 回答 3

4
  1. 只要它们是弱引用,您就不需要将属性设置为 nil。IBOutlets 通常应该是弱引用,因为它们视图控制器包含对视图的强引用,而视图又包含对其所有子视图的强引用。(如果您有不属于该视图层次结构的 IBOutlets,它们应该很强大。)
  2. 你不应该需要零或零任何东西,对象或标量。Xcode 在使用 Interface Builder 时会插入 nilling 语句,但这仍然是为 pre-ARC Objective-C 生成代码。

你可能甚至不需要viewDidUnload; 它只在特殊情况下调用,当内存压力较低时。因此,您不能依赖它进行清理。您的 IBOutlets 应该很弱,因此当视图从视图控制器中清除时它们会被自动清理(如果重新加载视图,它们将被恢复)。

我在这里假设您正在编写一个新产品,这意味着您只针对 iOS 5 或更高版本。如果您在新产品中以 iOS 4 为目标,那么您真的不应该这样做。世界已经在发展,iOS 5 或更高版本占据了 80% 的市场份额。这就是今天。展望未来,对于更小比例的人来说,避免使用 iOS 5 功能将变得更加困难。

于 2012-06-19T17:19:30.317 回答
1

@properties 的内存管理在 ARC 下自动处理。当您将自己设置为委托时,通常在离开之前将委托设置为 nil(例如在 viewWillDisapear 中),以便将来对委托的调用不会引用垃圾。请继续关注即将发布的 WWDC 视频以获取最新指导。

于 2012-06-19T17:32:43.760 回答
0

在 viewDidUnload 中,您需要将 outlet 引用设置为 nil,因为 ARC 会释放它们,并且您不想在发生这种情况后意外使用它们。

您不必对属性做任何事情,它们将被自动处理。事实上,你通常甚至没有使用 ARC 的 dealloc 方法。

于 2012-06-19T17:20:21.247 回答