2013-10-05 36 views
1

在苹果例如ARC的所有权与强,弱引用

MyViewController *myController = [[MyViewController alloc] init…]; 

MyViewController * __weak weakMyController = myController; 
myController.completionHandler = ^(NSInteger result) { 
    MyViewController *strongMyController = weakMyController; 
    if (strongMyController) { 

     [strongMyController dismissViewControllerAnimated:YES completion:nil]; 

    } 
    else { 
     // Probably nothing... 
    } 
}; 

这到底是怎么回事?我很困惑: MyViewController * strongMyController = weakMyController;

这是否意味着weakMyController对它有强烈的引用,所以它会像weakMyController的保留计数+1一样?当您创建一个弱的iVar的强引用时会发生什么?

回答

0

这是否意味着weakMyController对它有强烈的引用,所以它 会像weakMyController的保留计数+1?

myController的保留计数对所有有参考的变量都是一样的。它是对象的值,而不是指向它的变量。它告诉运行时间有很多强指向对象的引用。

所以,行

MyViewController *strongMyController = weakMyController; 

都会增加计数1,并保证只要我们有范围的变量,该视图控制器将不会被释放。

在大多数情况下,只需在块内的弱引用上调用方法就足够了(在您的示例中为weakMyController)。我认为在这种情况下,他们使用强引用是因为有一个动画涉及(所以视图控制器需要在动画期间存在,如果我们使用弱引用则不能保证)。

要回答您的问题的其他部分,对对象的所有强和弱引用都保持相同的值(对象的内存地址)。强者与弱者的区别在于他们获得价值时会发生什么。在弱引用的情况下,保留计数保持不变,而强引用则增加。

+0

谢谢,但你能解释为什么这样做不会导致保留周期?这似乎是因为strongMyController会导致保留周期,因为strongMyController现在是指向myController的weakMyController的所有者。 – SukyaMaki

+0

因为weakMyController不会以任何方式增加保留计数。弱代表不会创建保留周期的原因也是一样的。 – MikeS

+1

好问题!如果在块中的任何位置使用现有的强引用myController的行,就会发生保留周期。是的,你确实在块中创建了一个新的强引用,但只有在块被执行时才会创建,并且到那时myController可能会停止存在,并且'strongMyController'将会为零。所以,这里没有保留周期。 – Macondo2Seattle