2013-10-05 57 views
1

在蘋果例如ARC的所有權與強,弱引用

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

這是否意味着weakMyController對它有強烈的引用,所以它 會像weakMyController的保留計數+1?

myController的保留計數對所有有參考的變量都是一樣的。它是對象的值,而不是指向它的變量。它告訴運行時間有很多強指向對象的引用。

所以,行

MyViewController *strongMyController = weakMyController; 

都會增加計數1,並保證只要我們有範圍的變量,該視圖控制器將不會被釋放。

在大多數情況下,只需在塊內的弱引用上調用方法就足夠了(在您的示例中爲weakMyController)。我認爲在這種情況下,他們使用強引用是因爲有一個動畫涉及(所以視圖控制器需要在動畫期間存在,如果我們使用弱引用則不能保證)。

要回答您的問題的其他部分,對對象的所有強和弱引用都保持相同的值(對象的內存地址)。強者與弱者的區別在於他們獲得價值時會發生什麼。在弱引用的情況下,保留計數保持不變,而強引用則增加。

+0

謝謝,但你能解釋爲什麼這樣做不會導致保留週期?這似乎是因爲strongMyController會導致保留週期,因爲strongMyController現在是指向myController的weakMyController的所有者。 – SukyaMaki

+0

因爲weakMyController不會以任何方式增加保留計數。弱代表不會創建保留週期的原因也是一樣的。 – MikeS

+1

好問題!如果在塊中的任何位置使用現有的強引用myController的行,就會發生保留週期。是的,你確實在塊中創建了一個新的強引用,但只有在塊被執行時纔會創建,並且到那時myController可能會停止存在,並且'strongMyController'將會爲零。所以,這裏沒有保留週期。 – Macondo2Seattle