繁体   English   中英

具有强引用和弱引用的ARC所有权

[英]ARC ownership with strong and weak references

以苹果为例

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

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

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

所以,线

 MyViewController *strongMyController = weakMyController;

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM