在苹果示例中
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 :(得分:0)
这是否意味着weakMyController有一个强引用,所以它 就像weakMyController的保留计数+ 1?
对于具有引用的所有变量,myController的保留计数是相同的。它是对象的值,而不是指向它的变量。它告诉运行时很多强引用存在指向对象。
所以,行
MyViewController *strongMyController = weakMyController;
将该计数增加1,并确保只要我们在范围内有该变量,该视图控制器就不会被释放。
在大多数情况下,只需在块内的弱引用上调用方法(在示例中为weakMyController
)。我认为在这种情况下,他们使用强引用因为涉及动画(因此视图控制器需要在动画期间存在,如果我们使用弱引用则无法保证。)
要回答问题的其他部分,对对象的所有强引用和弱引用都保持相同的值(对象的内存地址)。强者和弱者之间的区别在于他们获得价值时会发生什么。在弱引用的情况下,保留计数保持不变,而使用强引用则会增加。