Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/103.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 具有强引用和弱引用的弧所有权_Ios_Objective C_Memory_Automatic Ref Counting - Fatal编程技术网

Ios 具有强引用和弱引用的弧所有权

Ios 具有强引用和弱引用的弧所有权,ios,objective-c,memory,automatic-ref-counting,Ios,Objective C,Memory,Automatic Ref Counting,以苹果为例 MyViewController *myController = [[MyViewController alloc] init…]; MyViewController * __weak weakMyController = myController; myController.completionHandler = ^(NSInteger result) { MyViewController *strongMyController = weakMyController;

以苹果为例

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
)。我认为在这种情况下,它们使用强引用,因为涉及到动画(因此视图控制器需要在动画期间存在,如果我们使用弱引用,这将无法保证)


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

谢谢,但是您能解释一下为什么这样做不会导致retain循环吗?因为strongMyController现在是指向myController的weakMyController的所有者,所以strongMyController似乎会导致保留周期。因为weakMyController不会以任何方式增加保留计数。这与弱代理不创建保留周期的原因相同。好问题!如果在块中的任何位置有一条使用myController的现有强引用的线,则会发生保留循环。是的,您确实在块中创建了一个新的强引用,但它只有在执行块时才会被创建,到那时myController可能不再存在,
strongMyController
将为零。所以,这里没有保留循环。谢谢@BlackRider的解释。为了确保我理解正确:因为strongMyController是在块中创建的,所以它只存在于块的词法范围内,所以在块完成后,执行strongMyController的额外保留计数将减少。此外,只要执行块时myController存在,strongMyController将在块期间保留myController。是的,这是正确的。此外,在您的具体示例中,我相信只要
DismissViewControllerInitiated:
正在运行(退出块时,它可能仍在运行),那么
strongMyController
就会一直保持
myController