ARC下的IBOutlet和viewDidUnload

Stu*_*art 36 weak-references iboutlet ios automatic-ref-counting

还有一个类似的问题这对SO 在这里,但我只是想澄清的东西,并没有完全解释存在.

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

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

@property (nonatomic, weak) IBOutlet UILabel *myLabel;
Run Code Online (Sandbox Code Playgroud)

以下代码是否有效?

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

    [super viewDidUnload];
}
Run Code Online (Sandbox Code Playgroud)

Dar*_*Teo 15

做一点研究......

据我了解,弱与分配类似,因为它们都是弱引用.

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

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

在这两种情况下,都没有必要将property设置为nil,因为它不会导致所讨论对象的保留计数.使用保留属性时必须这样做.

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

研究在这里完成

  • 再次,**据我了解**,View和它的子视图将从显示中删除时释放.因为,weak不会增加释放计数,并且在其引用被销毁时变为零,所以它不应该是必需的. (2认同)

Stu*_*art 11

我做了一个小测试,看来,在代码viewDidUnload的方法不必要的.为了支持这一点,viewDidUnload实际的文档确实说:

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

指示弱引用必须已nil自动设置.

  • 这也是我的理解.但是为什么Xcode在创建弱插座时会在`viewDidUnload`中插入`[self setMySubview:nil]`语句? (3认同)
  • 我认为_could_是一个从ARC前代码遗留下来的功能,就像你要求Xcode为Core Data生成一个`NSManagedObject`子类时生成的属性设置为`retain`而不是`strong`一样. .虽然在出口的情况下,他们__创建为"弱".我的猜测是,这是无意的. (2认同)

Emi*_*ier 5

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

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

明确的ivars都有nil它们的价值,然后我点击了断点.