36

SO here上有一个与此类似的问题,但是我只想澄清一些在那里没有完全解释的东西。

我知道所有的代表和出口——实际上任何对“父”对象的引用,作为一个好公民并考虑一下对象图——应该将弱引用归零。由于归零弱指针的性质会在引用对象的保留计数达到零时自动下降到零,这是否意味着viewDidUnload现在不需要将 IBOutlets 设置为 nil?

所以,如果我这样声明我的出口:

@property (nonatomic, weak) IBOutlet UILabel *myLabel;

下面的代码有什么作用吗?

- (void)viewDidUnload
{
    self.myLabel = nil;

    [super viewDidUnload];
}
4

5 回答 5

15

只是做一点研究...

据我了解,weak 类似于assign,因为它们都是弱引用。

但是,assign 不会创建归零引用。即,如果有问题的对象被破坏,并且您访问该属性,您将获得一个BAD_ACCESS_EXCEPTION.

当它引用的对象被销毁时,弱属性会自动归零(= nil)。

在这两种情况下,都没有必要将 property 设置为 nil,因为它不会影响所讨论对象的保留计数。使用保留属性时是必需的。

显然,ARC 还引入了一个新的“强”属性,与“保留”相同?

在这里完成的研究

于 2011-10-07T03:32:39.343 回答
11

我做了一些测试,似乎viewDidUnload方法中的代码不必要的。为了支持这一点,viewDidUnloaddo 的文档实际上说:

到调用此方法时,视图属性为零。

表示弱引用必须已设置为nil自动。

于 2011-10-07T03:45:46.013 回答
5

我有一些经验证据支持 IBOutlets 确实已经自动设置为零。这是我所做的:

  1. 我为我的 IBOutlet 属性 ( ) 设置了显式 ivars,@synthesize myLabel = myLabel_以便以后可以在调试器中检查它们的值。
  2. 我在第一行启用了断点viewDidUnload
  3. 我安排viewDidUnload通过模拟内存警告来调用。
  4. 我检查了与 IBOutlet 属性关联的显式 ivars 的值。

显式 ivars 都具有nil它们的价值,然后我达到了断点。

于 2012-02-27T19:36:23.343 回答
3

根据我对使用弱引用在 ARC 中如何管理网点的理解,您不需要向 viewDidUnload 添加任何内容,因为它已经为零。因此,这样做是多余的。

但是,如果您确实有强大的插座,如果您指向 nib 中的顶级项目,Apple 说您应该这样做,那么您绝对应该继续在 viewDidUnload 中添加适当的行来消除这些。

于 2012-02-24T23:55:23.020 回答
0

从 iOS 5 和 OS X 10.7 开始,weak将产生一个自动归零指针。这意味着当指向的对象被释放时,指针会自动设置为nil(有关详细信息,请参阅ARC 中的 Zeroing Weak References)。

所以,在 iOS 5+ 和 OS X 10.7+ 下,在方法中手动设置weak IBOutlet属性是没有用的:当主视图卸载时,它的所有子视图都会被释放,所以相关属性设置为。nilviewDidUnloadnil

于 2013-03-15T13:03:36.263 回答