1

以苹果为例

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 的retain count + 1?当您创建对弱 iVar 的强引用时会发生什么?

4

1 回答 1

0

这是否意味着weakMyController 对它有一个强引用,所以它就像weakMyController 的retain count + 1?

myController 的保留计数对于所有具有其引用的变量都是相同的。它是对象的值,而不是指向它的变量的值。它告诉运行时存在许多指向该对象的强引用。

所以,线

 MyViewController *strongMyController = weakMyController;

将使该计数增加 1,并确保只要我们在范围内拥有该变量,该视图控制器就不会被释放。

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

为了回答您问题的另一部分,对对象的所有强引用和弱引用都具有相同的值(对象的内存地址)。强弱之间的区别在于当他们得到他们的价值观时会发生什么。在弱引用的情况下,保留计数保持不变,而在强引用的情况下,它会增加。

于 2013-10-05T04:25:12.100 回答