具有强弱参考的ARC所有权

时间:2013-10-05 04:13:54

标签: ios objective-c memory automatic-ref-counting

在苹果示例中

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的强引用时会发生什么?

1 个答案:

答案 0 :(得分:0)

  

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

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

所以,行

 MyViewController *strongMyController = weakMyController;

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

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

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