ARC下的IBOutlet和viewDidUnload

时间:2011-10-07 01:50:42

标签: ios weak-references iboutlet automatic-ref-counting

在SO here上有一个类似的问题,但我只想澄清那里没有完全解释的内容。

我理解所有代表和出口 - 事实上任何对“父”对象的引用,要成为一个好公民并且考虑一分钟的对象图 - 应该归结为弱引用。由于零指针的性质在引用对象的保留计数达到零时自动降至零,这是否意味着现在不需要在viewDidUnload中将IBOutlets设置为nil?

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

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

以下代码是否有效?

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

    [super viewDidUnload];
}

5 个答案:

答案 0 :(得分:15)

做一些研究......

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

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

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

在这两种情况下,都没有必要将property设置为nil,因为它不会影响相关对象的保留计数。使用保留属性时必须这样做。

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

研究完成here

答案 1 :(得分:11)

我做了一些测试,看来viewDidUnload方法中的代码是不必要的。为了支持这一点,viewDidUnload的文档确实说:

  

调用此方法时,view属性为nil。

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

答案 2 :(得分:5)

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

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

答案 3 :(得分:3)

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

但是如果你确实有强大的出口,苹果公司说如果你指向笔尖中的顶级项目你应该这样做,那么你肯定应该继续在viewDidUnload中添加适当的行以取消这些出口。

答案 4 :(得分:0)

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

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