IB中的IBOutlet和viewDidUnload

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

我明白,所有代表和出路 – 事实上任何提及“父母”的对象,都是一个好的公民,并思考对象图一分钟 – 应该把弱引用归结为零。 由于归零弱指针的性质会自动降到零,而引用对象的保留计数达到零,这是否意味着将IBOutlets设置为零,现在viewDidUnload现在是不必要的了?

所以,如果我宣布我的出路是这样的:

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

下列代码是否有效?

 - (void)viewDidUnload { self.myLabel = nil; [super viewDidUnload]; } 

只是做一些研究…

据我所知,弱与分配类似,因为它们都是弱引用。

但是,分配不会创build归零参考。 即如果有问题的对象被销毁,并且您访问该属性,您将得到一个BAD_ACCESS_EXCEPTION

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

在这两种情况下,没有必要将财产设为零,因为它不会有助于保留对象的保留数量。 使用保留属性时有必要。

显然,ARC还引入了一个新的“强”属性,就像“保留”一样?

研究在这里完成

我做了一些testing,看来viewDidUnload方法中的代码不必要的。 为了支持这个, viewDidUnload的文档实际上是这样说的:

在调用这个方法的时候,view属性是nil。

表明弱参数必须自动设置nil

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

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

明确的ivars都nil作为它们的价值,然后我打破了断点。

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

然而,如果你有强大的渠道,苹果说,如果你指向笔尖顶级项目,你应该做的,那么你应该继续在viewDidUnload中添加适当的行来删除这些。

从iOS 5和OS X 10.7开始, weak会产生一个自动归零指针。 这意味着当指出的对象被释放时,指针被自动设置nil (详细信息请参见清零ARC中的弱引用 )。

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